Harici bir DLL dosyasına dayanan bir Visual Studio C ++ projem var. Projeyi oluştururken, Visual Studio'nun bu DLL dosyasını otomatik olarak çıktı dizinine (hata ayıklama / yayınlama) kopyalamasını nasıl sağlayabilirim?
Yanıtlar:
Projenizde derleme sonrası bir eylem kullanın ve sorun teşkil eden DLL'yi kopyalamak için komutları ekleyin. Oluşturma sonrası eylem, toplu komut dosyası olarak yazılır.
Çıktı dizinine şu şekilde başvurulabilir $(OutDir)
. Proje dizini olarak mevcuttur $(ProjDir)
. Derleme sonrası eylemi bozmadan proje klasörünüzü kopyalayabilmeniz veya taşıyabilmeniz için, uygun olan yerlerde göreli yolları kullanmaya çalışın.
$ (OutDir), VS2013'te göreceli bir yol olarak ortaya çıktı, bu yüzden istenen etkiyi elde etmek için $ (ProjectDir) ile birleştirmek zorunda kaldım:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
BTW, başlangıçta 'echo' ekleyerek komut dosyalarında kolayca hata ayıklayabilir ve derleme çıktı penceresinde genişletilmiş metni gözlemleyebilirsiniz.
Yukarıdaki yorumlar bölümündeki ayrıntılar, bir C ++ projesinden çıktı dll'sini aynı çözüm içindeki başka bir C # projesinin yayın ve hata ayıklama klasörüne kopyalamaya çalışırken benim için çalışmadı (VS 2013).
Aşağıdaki inşa sonrası eylemi (.dll çıktısı olan projeye sağ tıklayın) ve ardından özellikler -> yapılandırma özellikleri -> yapı olayları -> oluşturma sonrası olay -> komut satırı eklemem gerekiyordu
şimdi çıktı dll'sini iki klasöre kopyalamak için şu iki satırı ekledim:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(Bu cevap yalnızca C # için geçerlidir, C ++ için değil, üzgünüm, orijinal soruyu yanlış anladım)
Daha önce böyle DLL cehenneminden geçtim. Son çözümüm, yönetilmeyen DLL'leri yönetilen DLL'de ikili kaynaklar olarak depolamak ve program başladığında bunları geçici bir klasöre çıkarmak ve elden çıkarıldığında bunları silmekti.
Bu , çok kullanışlı olduğu için .NET veya pinvoke altyapısının bir parçası olmalıdır .... Yönetilen DLL'nizin hem Xcopy kullanarak hem de daha büyük bir Visual Studio çözümünde Proje referansı olarak yönetilmesini kolaylaştırır. Bunu yaptıktan sonra, derleme sonrası olaylar için endişelenmenize gerek kalmaz.
GÜNCELLEME:
Kodu buraya başka bir cevapta gönderdim https://stackoverflow.com/a/11038376/364818
Project.csproj dosyasına yerleşik COPY ekleyin :
<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)"
Ayrıca göreceli bir yola da başvurabilirsiniz, sonraki örnek DLL'yi proje klasörünün bir seviye üzerinde bulunan bir klasörde bulacaktır. DLL'yi tek bir çözümde kullanan birden çok projeniz varsa, bu, DLL'nin kaynağını, bunlardan herhangi birini Başlangıç Projesi olarak ayarladığınızda ulaşılabilir ortak bir alana yerleştirir.
xcopy /y /d "$(ProjectDir)..\External\*.dll" "$(TargetDir)"
/y
Onay almadan seçenek kopyalar. /d
Bir dosya hedefte varsa ve sadece kopya yaparsa kaynak hedeften daha yeni zaman damgası varsa opsiyon denetler.
Visual Studio'nun VS2109 gibi en azından daha yeni sürümlerinde $(ProjDir)
tanımsız olduğunu ve $(ProjectDir)
bunun yerine kullanılması gerektiğini buldum .
Bir hedef klasörü içinde bırakmak xcopy
varsayılan olarak çıktı dizinine bırakılmalıdır. $(OutDir)
Tek başına mantığın yardımcı olmadığını anlamak önemlidir .
$(OutDir)
, en azından Visual Studio'nun son sürümlerinde, çıktı klasörüne giden göreceli bir yol olarak tanımlanır bin/x86/Debug
. Hedef olarak tek başına kullanmak proje çıktı klasöründen başlayarak yeni bir klasör kümesi oluşturacaktır. Ör: … bin/x86/Debug/bin/x86/Debug
.
Bunu proje klasörüyle birleştirmek sizi doğru yere götürmelidir. Ör: $(ProjectDir)$(OutDir)
.
Bununla birlikte $(TargetDir)
, çıktı dizinini tek adımda sağlayacaktır.
Microsoft'un Visual Studio'nun geçerli ve önceki sürümleri için MSBuild makroları listesi