【问题标题】:Warning when using nuget package that contains native DLL使用包含本机 DLL 的 nuget 包时发出警告
【发布时间】:2018-06-15 18:31:30
【问题描述】:

我正在构建一个 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 包装器项目/包,以便下游消费者不会尝试自己加载这些本机库并生成警告?

【问题讨论】:

    标签: nuget .net-standard


    【解决方案1】:

    本机库不应属于 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 项目)选择正确的资产。

    【讨论】:

    • 这似乎不适用于网络框架项目?
    • 这是特定于 PackageReference 使用 nuget 包的风格。这在受支持的 .NET Framework 项目类型中也是可能的(例如控制台应用程序、类库,但不是经典的 ASP.NET)
    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多