Come fare in modo che Visual Studio copi un file DLL nella directory di output?


101

Ho un progetto Visual Studio C ++ che si basa su un file DLL esterno. Come posso fare in modo che Visual Studio copi automaticamente questo file DLL nella directory di output (debug / rilascio) quando compilo il progetto?

Risposte:


91

Usa un'azione di post-compilazione nel tuo progetto e aggiungi i comandi per copiare la DLL incriminata. Le azioni di post-compilazione vengono scritte come script batch.

È possibile fare riferimento alla directory di output come $(OutDir). La directory del progetto è disponibile come $(ProjDir). Prova a utilizzare i percorsi relativi ove applicabile, in modo da poter copiare o spostare la cartella del progetto senza interrompere l'azione di post-compilazione.


26
Vale anche la pena sottolineare che può impostare l'evento post-build tramite Progetto> Proprietà> Eventi build> Evento post-build.
Phil Booth


37
Nel caso in cui il collegamento si interrompesse: "xcopy / y" $ (ProjectDir) *. Dll "" $ (OutDir) "
asso

Ho modificato quanto sopra per come uso personalmente il comando nelle mie istanze. Questo sarà; copia i file di sola lettura che è buono con il controllo del codice sorgente e crea la directory di destinazione (normalmente non necessaria). -> xcopy "$ (ProjectDir) *. dll" "$ (OutDir)" / i / r / y
Mangia da Joes

8
Aggiungi il flag / d a xCopy per impedire la ricopia non necessaria di file che non sono stati modificati nella directory di output.
Zoey

44

$ (OutDir) si è rivelato essere un percorso relativo in VS2013, quindi ho dovuto combinarlo con $ (ProjectDir) per ottenere l'effetto desiderato:

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

BTW, puoi facilmente eseguire il debug degli script aggiungendo "echo" all'inizio e osservare il testo espanso nella finestra di output della build.


3
$ (TargetDir) può sostituire $ (ProjectDir) $ (OutDir) perché è comunque una combinazione di entrambi.
person27

Nel mio caso senza / d, veniva visualizzato un errore di accesso negato. Ma / d come da documentazione è per la data. Non sono sicuro di quale sia la connessione.
Ravi C

1
L'aggiunta di / d impedisce la sovrascrittura se il file di origine è più vecchio o uguale a un file esistente. L'errore di accesso negato può verificarsi se la destinazione è bloccata da un altro processo.
Rich Shealer

7

I dettagli nella sezione commenti sopra non hanno funzionato per me (VS 2013) durante il tentativo di copiare la dll di output da un progetto C ++ nella cartella di rilascio e debug di un altro progetto C # all'interno della stessa soluzione.

Ho dovuto aggiungere la seguente azione post build (fare clic con il pulsante destro del mouse sul progetto che ha un output .dll) quindi proprietà -> proprietà di configurazione -> eventi di build -> evento post-build -> riga di comando

ora ho aggiunto queste due righe per copiare la dll di output nelle due cartelle:

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug

5

(Questa risposta si applica solo a C # non C ++, mi dispiace aver letto male la domanda originale)

Ho già superato l'inferno DLL come questo prima. La mia soluzione finale è stata quella di archiviare le DLL non gestite nella DLL gestita come risorse binarie ed estrarle in una cartella temporanea all'avvio del programma ed eliminarle quando viene eliminato.

Questo dovrebbe far parte dell'infrastruttura .NET o pinvoke, dal momento che è molto utile .... Rende la tua DLL gestita facile da gestire, sia usando Xcopy che come riferimento per il progetto in una soluzione Visual Studio più grande. Una volta fatto questo, non devi preoccuparti degli eventi post-build.

AGGIORNARE:

Ho pubblicato il codice qui in un'altra risposta https://stackoverflow.com/a/11038376/364818


1
Sono d'accordo, dovrebbe essere una parte del framework (per collegare staticamente dll, ecc.) - Vale la pena notare, archiviare la dll come risorsa e quindi estrarla in fase di esecuzione potrebbe causare problemi in alcuni ambienti aziendali (specialmente se hanno abbastanza software antivirus proattivo).
BrainSlugs83

1

Aggiungi COPIA incorporata nel file project.csproj :

  <Project>
    ...
    <Target Name="AfterBuild">
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
    </Target>
  </Project>

C'è un bug a lungo termine in VS, si prega di utilizzare ProjectDir anziché SolutionDir
John_J

0
xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

Puoi anche fare riferimento a un percorso relativo, il prossimo esempio troverà la DLL in una cartella situata un livello sopra la cartella del progetto. Se hai più progetti che utilizzano la DLL in un'unica soluzione, questo colloca l'origine della DLL in un'area comune raggiungibile quando ne imposti uno come Progetto di avvio.

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

L' /yopzione copia senza conferma. L' /dopzione controlla se esiste un file nella destinazione e se copia solo se l'origine ha un timestamp più recente rispetto alla destinazione.

Ho scoperto che almeno nelle versioni più recenti di Visual Studio, come VS2109, $(ProjDir)non è definito e doveva essere utilizzato $(ProjectDir).

Lasciando fuori una cartella di destinazione in xcopydovrebbe essere predefinita la directory di output. Questo è importante per capire che la ragione $(OutDir)da sola non è utile.

$(OutDir), almeno nelle versioni recenti di Visual Studio, è definito come un percorso relativo alla cartella di output, ad esempio bin/x86/Debug. Usandolo da solo come destinazione creerà un nuovo set di cartelle a partire dalla cartella di output del progetto. Ex:… bin/x86/Debug/bin/x86/Debug .

Combinarlo con la cartella del progetto dovrebbe portarti nel posto giusto. Es: $(ProjectDir)$(OutDir).

Tuttavia $(TargetDir)fornirà la directory di output in un unico passaggio.

Elenco di Microsoft delle macro di MSBuild per le versioni attuali e precedenti di Visual Studio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.