Jawaban:
Gunakan tindakan pasca pembuatan dalam proyek Anda, dan tambahkan perintah untuk menyalin DLL yang melanggar. Tindakan pasca-pembuatan ditulis sebagai skrip batch.
Direktori keluaran dapat dirujuk sebagai $(OutDir)
. Direktori proyek tersedia sebagai $(ProjDir)
. Coba gunakan jalur relatif jika memungkinkan, sehingga Anda dapat menyalin atau memindahkan folder proyek tanpa merusak tindakan pasca-pembuatan.
$ (OutDir) ternyata merupakan jalur relatif di VS2013, jadi saya harus menggabungkannya dengan $ (ProjectDir) untuk mencapai efek yang diinginkan:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
BTW, Anda dapat dengan mudah men-debug skrip dengan menambahkan 'echo' di awal dan mengamati teks yang diperluas di jendela keluaran build.
Detail di bagian komentar di atas tidak berfungsi untuk saya (VS 2013) ketika mencoba menyalin dll keluaran dari satu proyek C ++ ke folder rilis dan debug dari proyek C # lain dalam solusi yang sama.
Saya harus menambahkan post build-action berikut (klik kanan pada proyek yang memiliki output .dll) lalu properti -> properti konfigurasi -> build event -> post-build event -> command line
sekarang saya menambahkan dua baris ini untuk menyalin dll keluaran ke dalam dua folder:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(Jawaban ini hanya berlaku untuk C # bukan C ++, maaf saya salah membaca pertanyaan aslinya)
Saya telah melalui DLL neraka seperti ini sebelumnya. Solusi terakhir saya adalah menyimpan DLL yang tidak dikelola di DLL yang dikelola sebagai sumber daya biner, dan mengekstraknya ke folder sementara saat program diluncurkan dan menghapusnya saat dibuang.
Ini harus menjadi bagian dari infrastruktur .NET atau pinvoke, karena sangat berguna .... Itu membuat DLL terkelola Anda mudah dikelola, baik menggunakan Xcopy atau sebagai referensi Proyek dalam solusi Visual Studio yang lebih besar. Setelah Anda melakukan ini, Anda tidak perlu khawatir tentang acara pasca-pembangunan.
MEMPERBARUI:
Saya memposting kode di sini di jawaban lain https://stackoverflow.com/a/11038376/364818
Tambahkan COPY bawaan di 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)"
Anda juga dapat merujuk ke jalur relatif, contoh berikutnya akan menemukan DLL dalam folder yang terletak satu tingkat di atas folder proyek. Jika Anda memiliki beberapa proyek yang menggunakan DLL dalam satu solusi, ini menempatkan sumber DLL di area umum yang dapat dijangkau ketika Anda menetapkan salah satu dari mereka sebagai Proyek Startup.
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
The /y
salinan pilihan tanpa konfirmasi. The /d
pilihan pemeriksaan untuk melihat apakah file ada di target dan jika tidak hanya salinan jika sumber memiliki timestamp yang lebih baru dari target.
Saya menemukan bahwa setidaknya versi Visual Studio yang lebih baru, seperti VS2109, $(ProjDir)
tidak ditentukan dan harus digunakan $(ProjectDir)
sebagai gantinya.
Meninggalkan folder target di xcopy
harus default ke direktori output. Itu penting untuk memahami alasan $(OutDir)
saja tidak membantu.
$(OutDir)
, setidaknya dalam versi terbaru Visual Studio, ditetapkan sebagai lintasan relatif ke folder keluaran, seperti bin/x86/Debug
. Menggunakannya sendiri sebagai target akan membuat sekumpulan folder baru mulai dari folder keluaran proyek. Ex: … bin/x86/Debug/bin/x86/Debug
.
Menggabungkannya dengan folder proyek akan membawa Anda ke tempat yang tepat. Ex: $(ProjectDir)$(OutDir)
.
Namun $(TargetDir)
akan memberikan direktori keluaran dalam satu langkah.
Daftar makro MSBuild Microsoft untuk versi Visual Studio saat ini dan sebelumnya