Risposte:
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.
$ (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.
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
(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
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>
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' /y
opzione copia senza conferma. L' /d
opzione 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 xcopy
dovrebbe 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