使用包含本机DLL的nuget包时发出警告

时间:2018-01-05 22:28:45

标签: nuget .net-standard

我正在构建一个ASP.NET Core Web API应用程序,该应用程序使用.NET Standard 2.0库来包装一些C / C ++本机库。本机库构建在特定于平台的Win32 .dll,Linux .so和MacOS .dylib等中,并作为二进制文件包含在包装器库中。 NETStandard库检测用户的平台,并使用P / Invoke调用适当的本机库和方法。然后将此包装器库发布到内部NuGet包源,并从ASP.NET Core项目中引用。

这实际上运行良好并且按原样运行,但在ASP.NET项目的构建期间,我得到一系列与底层本机模块相关的警告:

Warning MSB3246 Resolved file has a bad image, no metadata, or is otherwise inaccessible. Could not load file or assembly 'mylibrary32.dll' or one of its dependencies. The module was expected to contain an assembly manifest.

本机库只是包含在包装器项目和包中,如下所示:

<ItemGroup>
  <None Pack="true" PackagePath="lib/netstandard2.0/mylibrary32.dll" Update="mylibrary32.dll">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
  <None Pack="true" PackagePath="lib/netstandard2.0/mylibrary64.dll" Update="mylibrary64.dll">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>      
  ... etc ...
</ItemGroup>

我可以很容易地忽略这些警告,但我们最终希望能够将这个nuget包分发给客户,并且立即引入可怕警告的项目参考并不理想。如何构建NETStandard包装器项目/包,以便下游消费者不会尝试自己加载这些本机库并生成警告?

1 个答案:

答案 0 :(得分:6)

本机库不应该是lib文件夹的一部分,而是根据.NET核心使用的运行时标识符打包在runtimes文件夹下。

所以你要打包进去。

runtimes/win-x86/native/mylib.dll
runtimes/win-x64/native/mylib.dll
runtimes/linux-x64/native/mylib.so
runtimes/osx-x64/native/mylib.dylib
…

从.NET Core应用程序使用时,这些文件将被放入runtimes文件夹中,主机将根据当前运行时标识符加载适当的文件夹。或者,NuGet将为特定于运行时的项目选择正确的资产,例如.NET Framework项目。

相关问题