Użycie elementu Copy
docelowego w pliku docelowym do skopiowania wymaganych bibliotek nie spowoduje skopiowania tych plików do innych projektów, które odwołują się do projektu, co spowoduje utworzenie pliku DllNotFoundException
. Można to zrobić za pomocą znacznie prostszego pliku docelowego, używając None
elementu, ponieważ program MSBuild skopiuje wszystkie None
pliki do projektów odwołujących się.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
<None Include="@(NativeLibs)">
<Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Dodaj plik docelowy do build
katalogu pakietu nuget wraz z wymaganymi bibliotekami natywnymi. Plik docelowy będzie zawierał wszystkie dll
pliki we wszystkich katalogach podrzędnych build
katalogu. Aby więc dodać wersję x86
i x64
wersję biblioteki natywnej używanej przez zestaw Any CPU
zarządzany, otrzymamy strukturę katalogów podobną do następującej:
- budować
- x86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
To samo x86
i x64
katalogi zostaną utworzone w katalogu wyjściowym projektu po zbudowaniu. Jeśli nie trzeba podkatalogi wtedy **
i %(RecursiveDir)
mogą być usunięte i zamiast zawierać wymagane pliki wbuild
katalogu bezpośrednio. W ten sam sposób można dodać inne wymagane pliki zawartości.
Pliki dodane None
w pliku docelowym nie będą wyświetlane w projekcie po otwarciu w programie Visual Studio. Jeśli zastanawiasz się, dlaczego nie używam Content
folderu w nupkg, to dlatego, że nie ma możliwości ustawienia CopyToOutputDirectory
elementu bez użycia skryptu PowerShell (który będzie uruchamiany tylko w programie Visual Studio, a nie z wiersza polecenia, na serwerach kompilacji lub w inne IDE i nie jest obsługiwane w projektach project.json / xproj DNX ) i wolę używać a Link
do plików, zamiast mieć dodatkową kopię plików w projekcie.
Aktualizacja:
Chociaż powinno to również działać, Content
a None
nie wydaje się, że jest błąd w msbuild, więc pliki nie będą kopiowane do projektów odwołujących się więcej niż jeden krok usunięty (np. Proj1 -> proj2 -> proj3, proj3 nie pobierze plików z pakietu NuGet proj1, ale proj2 będzie).