O uso do Copy
destino no arquivo de destinos para copiar as bibliotecas necessárias não copiará esses arquivos para outros projetos que fazem referência ao projeto, resultando em um arquivo DllNotFoundException
. No entanto, isso pode ser feito com um arquivo de destinos muito mais simples, usando um None
elemento, pois o MSBuild copiará todos os None
arquivos para projetos de referência.
<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>
Inclua o arquivo de destinos no build
diretório do pacote nuget, juntamente com as bibliotecas nativas necessárias. O arquivo de destinos incluirá todos os dll
arquivos em todos os diretórios filhos do build
diretório. Portanto, para adicionar uma versão x86
e x64
uma biblioteca nativa usada por um Any CPU
assembly gerenciado, você terminaria com uma estrutura de diretório semelhante à seguinte:
- Construir
- x86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
Os mesmos diretórios x86
e x64
serão criados no diretório de saída do projeto quando criados. Se você não precisa de subdiretórios em seguida, o **
e %(RecursiveDir)
podem ser removidos e, em vez incluir os arquivos necessários no build
diretório diretamente. Outros arquivos de conteúdo necessários também podem ser adicionados da mesma maneira.
Os arquivos adicionados como None
no arquivo de destinos não serão mostrados no projeto quando abertos no Visual Studio. Se você está se perguntando por que não uso a Content
pasta no nupkg, é porque não há como definir o CopyToOutputDirectory
elemento sem usar um script PowerShell (que só será executado no Visual Studio, não no prompt de comando, nos servidores de compilação ou no outros IDEs, e não é suportado nos projetos project.json / xproj DNX ) e eu prefiro usar Link
a nos arquivos em vez de ter uma cópia adicional dos arquivos no projeto.
Atualização:
Embora isso também deva funcionar, em Content
vez de None
parecer que existe um bug no msbuild, os arquivos não serão copiados para referenciar projetos mais de uma etapa removida (por exemplo, proj1 -> proj2 -> proj3, proj3 não obterá os arquivos do pacote NuGet do proj1, mas o proj2 será).