El uso del Copy
destino en el archivo de destino para copiar las bibliotecas requeridas no copiará esos archivos a otros proyectos que hagan referencia al proyecto, lo que dará como resultado un DllNotFoundException
. Sin embargo, esto se puede hacer con un archivo de objetivos mucho más simple, utilizando un None
elemento, ya que MSBuild copiará todos los None
archivos a proyectos de referencia.
<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>
Agregue el archivo de destino al build
directorio del paquete nuget junto con las bibliotecas nativas requeridas. El archivo de objetivos incluirá todos los dll
archivos en todos los directorios secundarios del build
directorio. Así que añadir una x86
y x64
versión de una biblioteca nativa utilizada por un Any CPU
ensamblado administrado que terminaría con una estructura de directorios similar a la siguiente:
- construir
- x86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
Lo mismo x86
y los x64
directorios se crearán en el directorio de salida del proyecto cuando se construyan. Si no necesita subdirectorios, el **
y el %(RecursiveDir)
se pueden eliminar y, en su lugar, incluir los archivos necesarios en el build
directorio directamente. Otros archivos de contenido necesarios también se pueden agregar de la misma manera.
Los archivos agregados como None
en el archivo de destino no se mostrarán en el proyecto cuando se abran en Visual Studio. Si se pregunta por qué no uso la Content
carpeta en el nupkg es porque no hay forma de configurar el CopyToOutputDirectory
elemento sin usar un script de PowerShell (que solo se ejecutará dentro de Visual Studio, no desde el símbolo del sistema, en los servidores de compilación o en otros IDEs, y no es compatible con proyectos project.json / xproj DNX ) y prefiero usar a Link
para los archivos en lugar de tener una copia adicional de los archivos dentro del proyecto.
Actualización:
aunque esto también debería funcionar en Content
lugar de None
parecer que hay un error en msbuild, por lo que los archivos no se copiarán a proyectos de referencia que se eliminen más de un paso (por ejemplo, proj1 -> proj2 -> proj3, proj3 no obtendrá los archivos del paquete NuGet de proj1 pero proj2 lo hará).