El uso del Copydestino 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 Noneelemento, ya que MSBuild copiará todos los Nonearchivos 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 builddirectorio del paquete nuget junto con las bibliotecas nativas requeridas. El archivo de objetivos incluirá todos los dllarchivos en todos los directorios secundarios del builddirectorio. Así que añadir una x86y x64versión de una biblioteca nativa utilizada por un Any CPUensamblado 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 x86y los x64directorios 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 builddirectorio directamente. Otros archivos de contenido necesarios también se pueden agregar de la misma manera.
Los archivos agregados como Noneen 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 Contentcarpeta en el nupkg es porque no hay forma de configurar el CopyToOutputDirectoryelemento 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 Linkpara 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 Contentlugar de Noneparecer 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á).