2013-06-12 24 views
16

Sto lavorando a un progetto che richiede che le DLL generate dalla creazione della mia soluzione vengano copiate dalla cartella bin in un'altra cartella, entrambe sulla mia macchina, nella mia unità C. Ho scritto un file batch che utilizza xcopy per raggiungere questo obiettivo, che potete vedere qui:Come posso correggere l'errore MSB3073 nel mio evento post-build?

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\" 

Ora, ho provato numerose iterazioni di questo file, che si trova all'indirizzo:

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

quindi il mio post-generazione linea di comando evento si presenta così:

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

ho eseguito questo file batch da solo con due file di testo in cartelle sul mio desktop, e funziona benissimo. L'ho anche eseguito come è con i file che ho bisogno di copiare da solo, e funziona anche bene. Tuttavia, quando si tenta di eseguire questo come un evento post-generazione, ottengo questo output:

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. 

Ho fatto qualche ricerca, e ha scoperto che il codice di errore 4 indica che "si è verificato l'errore di inizializzazione Non c'è. abbastanza memoria o spazio su disco, oppure hai inserito un nome di unità non valido o una sintassi non valida sulla riga di comando. "

Ho anche cercato cosa sia MSB3073 e non ho trovato molto che possa aiutarmi. Quindi, la mia domanda è: cosa sto sbagliando? I percorsi assoluti lo incasinano? Qualsiasi aiuto qui è apprezzato.

risposta

19

Giocare con le diverse proprietà del progetto, ho scoperto che l'ordine di costruzione del progetto era il problema. Il progetto che ha generato i file che volevo copiare è stato creato secondo, ma il progetto che eseguiva il file batch come evento post-build è stato creato prima, quindi ho semplicemente collegato l'evento di build al secondo progetto, invece, e funziona bene. Grazie per il tuo aiuto, a tutti, comunque.

+0

Questo ha risolto il problema per me. È stato aggiunto un nuovo modulo che utilizzava gli stessi file di quello con l'evento post-build. Ho aggiunto nuove dipendenze e ha funzionato di nuovo. – vasquez

12

Preferisci l'attività "Copia" di MsBuild in una destinazione AfterBuild su un evento post-build.

Aggiungere questo Target nel file di progetto e rimuovere 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> 
+1

Freddo, domani lo farò uno scatto quando torno al lavoro. Sono solo perplesso perché questo non funzionava solo con questi due file. L'ho provato con due file non correlati al progetto sul mio desktop, che funzionavano bene come evento post-build. –

+0

Ancora meglio quando si specifica il file utilizzando i metadati anziché un percorso hard codificato, ad es. SourceFiles = "$ (TargetPath)". –

+0

@Nick Carlson dove appendo effettivamente questo? Cosa intendi con il file di progetto? Come, MainWindow.xaml? –

7

Per quello che vale, il problema nel mio caso è stato causato dall'uso di "/" come separatore di directory in un comando copy. È necessario utilizzare i backslash.

1

Se il problema persiste anche dopo aver inserito la versione successiva nel progetto corretto, provare a utilizzare "copia" anziché xcopy. Questo ha funzionato per me.

0

Ho avuto lo stesso problema per il mio progetto Test. Ho scoperto perché il mio evento post build non funzionava e questo perché stavo copiando i file prima di eseguire il comando $ (ProjectName) .exe e alcuni di questi file erano necessari per il progetto Test stesso. Quindi, spostando semplicemente $ (ProjectName) .exe come primo comando risolvi il problema.

3

Nel mio caso, la DLL che stavo creando creando il progetto era ancora in uso in background. Ho ucciso l'applicazione e quindi xcopy ha funzionato correttamente come previsto.

+0

questa è una soluzione salvavita :) –

0

Questo è troppo tardi ma postare la mia esperienza per le persone che ci guardano più tardi: - In MS VS 2010 ho avuto lo stesso problema. È stato risolto inserendo virgolette per postare comandi di copia copia che contenevano spazi !!!

In Project Proprietà -> Proprietà di configurazione -> Eventi di generazione -> post-generazione Evento -> riga di comando ha cambiato

copia $ (ProjectDir) a \ b \ c $ (OutputPath)

a

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

0

che ho trovato il problema accade quando si dispone di più progetti in parallelo edificio e uno o più dei i progetti stanno tentando di copiare gli stessi file, creando condizioni di gara che si tradurranno in errori occasionali. Quindi come risolverlo?

C'è un sacco di opzioni, come sopra solo cambiare le cose in giro potrebbe risolvere il problema per alcune persone. Soluzioni più solide sarebbero ...

a. Limita i file da copiare, ad esempio invece di xcopy $ (TargetDir) ." ... invece fare xcopy "$ (TargetDir) $ (TargetName). *" ...

b. Prendere l'errore e riprovare cioè

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

c. Robocopy utente invece di xcopy

d. probabilmente non si vuole fare questo in quanto aumenterà i tempi di compilazione, ma si potrebbe ridurre il numero massimo di progetto parallelo costruisce a 1 ... enter image description here

0

l'evento di post-generazione (sotto Build Events, nelle proprietà dialogo) di un progetto importato, aveva una variabile di ambiente che non era definita.
Spostarsi su Control Panel\All Control Panel Items\System\Advanced system settings per aggiungere l'appropriato environment variable, and doing no more al riavvio di VS2017 risolto l'errore.

Problemi correlati