wake-up-neo.com

Wie kann ich den Fehler MSB3073 in meinem Postbuild-Ereignis beheben?

Ich arbeite an einem Projekt, bei dem von der Erstellung meiner Lösung generierte DLLs aus dem Ordner bin in einen anderen Ordner kopiert werden müssen, der sich beide auf meinem Computer und auf meinem Laufwerk C befindet. Ich habe eine Batchdatei geschrieben, in der xcopy verwendet wird. Dies können Sie hier sehen:

xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"

Ich habe jetzt zahlreiche Iterationen dieser Datei ausprobiert, die sich unter:

C:\Users\scogan\Desktop\CopyFiles.bat

so sieht meine Befehlszeile nach dem Build-Event so aus:

call C:\Users\scogan\Desktop\CopyFiles.bat

Ich habe diese Batchdatei alleine mit zwei Textdateien in Ordnern auf meinem Desktop ausgeführt, und sie funktioniert einwandfrei. Ich habe es auch so ausgeführt, wie es mit den Dateien ist, die ich selbst kopieren muss, und das funktioniert auch gut. Wenn ich jedoch versuche, dies als Post-Build-Ereignis auszuführen, erhalte ich folgende Ausgabe:

1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1>  File not found - Organizr.Services.dll
1>  0 File(s) copied
1>  0 File(s) copied
1>  File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.

Ich habe einige Nachforschungen angestellt und festgestellt, dass Fehlercode 4 bedeutet, dass "Initialisierungsfehler aufgetreten ist. Es ist nicht genügend Speicher oder Speicherplatz vorhanden oder Sie haben einen ungültigen Laufwerksnamen oder eine ungültige Syntax in die Befehlszeile eingegeben."

Ich habe auch nachgeschlagen, was MSB3073 ist, und nicht wirklich viel gefunden, was mir da helfen kann. Meine Frage ist also, was mache ich falsch? Sind die absoluten Pfade durcheinander? Jede Hilfe hier wird geschätzt.

20
Sean Cogan

Als ich mit verschiedenen Projekteigenschaften herumspielte, stellte ich fest, dass die Reihenfolge der Projekterstellung das Problem war. Das Projekt, das die Dateien generiert hat, die ich kopieren wollte, wurde second erstellt, aber das Projekt, in dem die Batchdatei als Postbuildereignis ausgeführt wurde, wurde first erstellt. Ich habe also das Buildereignis einfach an das angehängt stattdessen ein zweites Projekt, und es funktioniert gut. Vielen Dank für Ihre Hilfe, trotzdem.

21
Sean Cogan

Ziehen Sie die MsBuild-Task "Kopieren" in einem AfterBuild-Ziel einem Postbuild-Ereignis vor.

Fügen Sie dieses Ziel in Ihre Projektdatei ein und entfernen Sie das PostBuildEvent. 

<Target Name="AfterBuild">
    <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
          DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
          OverwriteReadOnlyFiles="true" 
          SkipUnchangedFiles="false" />
</Target>
13
Nicodemeus

Für das, was es wert ist, wurde das Problem in meinem Fall durch die Verwendung von '/' als Verzeichnisseparator in einem Befehl copy verursacht. Muss umgekehrte Schrägstriche verwenden.

8
darda

In meinem Fall wurde die durch das Erstellen des Projekts erstellte DLL im Hintergrund noch verwendet. Ich habe die Anwendung beendet und xcopy funktionierte wie erwartet.

4
ashish

Wenn das Problem auch nach dem Einfügen des After Builds im richtigen Projekt bestehen bleibt, versuchen Sie "copy" anstelle von xcopy. Das hat bei mir funktioniert.

1
Pandele Florin

Dies ist zu spät, aber ich möchte meine Erfahrung für Leute veröffentlichen, die sich später damit befassen: - Es wurde behoben, indem Anführungszeichen gesetzt wurden, um Befehle nach dem Build-Copy-Befehl zu erstellen, die Leerzeichen enthielten !!!

In Projekteigenschaften -> Konfigurationseigenschaften -> Build-Ereignisse -> Post-Build-Ereignis -> Befehlszeile wurde geändert 

kopiere $ (ProjectDir) a\b\c $ (Ausgabepfad)

zu

kopiere "$ (ProjectDir) a\b\c" "(OutputPath)" 

1
Zakir

Der angegebene Fehler bezieht sich auf das nachgebaute Ereignis. Irgendwie kann das VS-Tool die Dateien nicht in den Zielordner kopieren. Dafür kann es viele Gründe geben. Um die genaue Fehlerursache zu überprüfen, gehen Sie zu Tools> Option> Project and Solution> Built and run , und ändern Sie " MsBuild Projektbuildausgabe Ausführlichkeit " in " Diagnose ". Sie erhalten genügend Informationen, um das tatsächliche Problem zu erkennen.

1

Bevor Sie den copy-Befehl ausführen, sollten Sie Folgendes tun, wenn Sie Probleme mit dem copy-Befehl haben 

  1. lösung als Administrator öffnen und Lösung erstellen.
  2. wenn Sie ein Problem wie "0 Datei (en) kopiert" haben, überprüfen Sie den Quell- und Zielpfad. Möglicherweise verwenden Sie einen falschen Pfad. Es wäre besser, wenn Sie den gleichen Befehl in "Eingabeaufforderung" ausführen, um zu überprüfen, ob er einwandfrei funktioniert oder nicht. 
0
suraj kumar

Ich hatte das gleiche Problem für mein Testprojekt. Ich habe herausgefunden, warum mein Postbuildereignis nicht funktioniert hat. Das liegt daran, dass ich vor dem Ausführen des Befehls $ (ProjectName) .exe Dateien kopierte. Einige dieser Dateien waren für das Testprojekt selbst erforderlich. Indem Sie die Datei $ (ProjectName) .exe als ersten Befehl verschieben, beheben Sie das Problem.

0
Awan

Ich habe festgestellt, dass das Problem auftritt, wenn mehrere Projekte parallel erstellt werden und eines oder mehrere der Projekte versuchen, die gleichen Dateien zu kopieren, wodurch Race-Bedingungen geschaffen werden, die gelegentlich zu Fehlern führen. So wie es zu lösen ist? 

Es gibt viele Optionen, da das Ändern einiger Dinge das Problem für manche Menschen lösen könnte. Robustere Lösungen wären ...

ein. Schränken Sie die zu kopierenden Dateien ein, d. H. Anstelle von xcopy $ (TargetDir) . "... stattdessen xcopy" $ (TargetDir) $ (TargetName). * "... 

b. Fangen Sie den Fehler ab und versuchen Sie es erneut

:loop
xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
if ErrorLevel 1 goto loop

c. User-Robocopy statt Xcopy

d. Sie möchten dies wahrscheinlich nicht tun, da dies Ihre Build-Zeiten erhöht, aber Sie könnten die maximale Anzahl paralleler Projekt-Builds auf 1 reduzieren ...  enter image description here

0
Mick

Das Post-Build-Ereignis (unter Build Events im Eigenschaftendialogfeld) eines importierten Projekts hatte eine Umgebungsvariable, die nicht definiert wurde. 
Navigierte zu Control Panel\All Control Panel Items\System\Advanced system settings, um die entsprechende Umgebungsvariable hinzuzufügen, und nicht mehr als den Neustart von VS2017. Der Fehler wurde behoben.
Erstellen Sie außerdem im Anschluss an @Seans und andere Antworten zu mehreren Projektwettbewerben/Streitigkeiten einen temporären Ordner im Ausgabeordner. 

 like so

und wählen Sie das Projekt aus, das die bevorzugte Ausgabe erzeugt:

 enter image description here

und build (kein rebuild/clean) ist eine schnelle Lösung.

0
Laurie Stearn

Ich habe es folgendermaßen gelöst: In Visual Studio ging ich zu Projekt -> Projektabhängigkeiten

Ich wählte die XXX.Test-Lösung aus und teilte ihr mit, dass es auch von der XXX-Lösung abhängt, dass die Post-Build-Ereignisse in der XXX.Test-Lösung diesen Fehler nicht erzeugen (Exit mit Code 4).

Grüße,

0
Antonin GAVREL