Użycie elementu Copydocelowego 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 Noneelementu, ponieważ program MSBuild skopiuje wszystkie Nonepliki 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 buildkatalogu pakietu nuget wraz z wymaganymi bibliotekami natywnymi. Plik docelowy będzie zawierał wszystkie dllpliki we wszystkich katalogach podrzędnych buildkatalogu. Aby więc dodać wersję x86i x64wersję biblioteki natywnej używanej przez zestaw Any CPUzarzą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 x86i x64katalogi 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 Nonew pliku docelowym nie będą wyświetlane w projekcie po otwarciu w programie Visual Studio. Jeśli zastanawiasz się, dlaczego nie używam Contentfolderu w nupkg, to dlatego, że nie ma możliwości ustawienia CopyToOutputDirectoryelementu 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 Linkdo plików, zamiast mieć dodatkową kopię plików w projekcie.
Aktualizacja:
Chociaż powinno to również działać, Contenta Nonenie 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).