【问题标题】:Create Nuget package for different platforms, architectures and .net versions为不同的平台、架构和 .net 版本创建 Nuget 包
【发布时间】:2021-09-30 14:04:31
【问题描述】:

我有一个 C# 7.3 项目Foo,我想将它作为 Nuget 包发布。我希望我的包可用于不同的架构(x86 和 x64)、不同的平台(Windows 和 Linux)和不同的 .Net 版本(4.8 框架和 5.0)。

Foo C# 代码本身不包含任何特定于体系结构的代码,它仅包含纯 C# 7.3。但是这个项目在 Linux 上使用了我自定义的特定于平台的 .dll 和 .so(比如ExternalLib.dll / ExternalLib.dll.so)。对于每个 Windows x64、Windows x86 等,我都有一个。

我知道在 NuGet 包中,您将特定于运行时的组件放置在 /runtimes 文件夹结构中,例如 /runtimes/win10-x64/native/ExternalLib.dll。正如documentation 所说,这些将仅用于运行时,我需要指定编译时引用。

我为每个 net4.7 和 net5.0 在 Any CPU 配置中构建了我的 Foo 项目,并将每个 Foo.dll 放置在 /lib 文件夹中。所以我的模块的最终文件夹结构是

Project.nuspec
/lib
    /net4.7/Foo.dll
    /net5.0/Foo.dll
/runtimes
         /win10-x64/native/ExternalLib.dll
         /win10-x86/native/ExternalLib.dll
         /linux-x64/native/ExternalLib.dll.so

项目.nuspec:

<?xml version="1.0" encoding="utf-8"?>
<package>
  <metadata>
    /* */
    <dependencies>
      <group targetFramework=".NETFramework4.8" />
      <group targetFramework="net5.0" />
    </dependencies>
  </metadata>
</package>

我使用nuspec pack Project.nuspec 命令构建了一个包。它没有错误,但是当我将此包添加到任何 .net 项目并尝试使用其中的任何功能时,VS 无法从我的库中找到任何内容。

我做错了什么?

【问题讨论】:

    标签: c# .net dll nuget


    【解决方案1】:

    我终于做到了。经过研究,这是我的方法:

    1. 如果您编写 C# 库,请仅使用 .NetStandard,因此 .Net 和 .NetFramework 应用程序都可以使用您的库。我使用了 .NetStandard2.0,它可以从 .Net5.0 和 .NetFramework4.8 中使用。所有兼容版本请参见this

    2. 清除 NuGet 缓存

    3. 提供 xml 文档(可选)

    最终的 .nuspec 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <package >
      <metadata>
        ...
        <dependencies>
          <group targetFramework="netstandard2.0" />
        </dependencies>
      </metadata>
    
      <files>
        <!--Path to documentaion and AnyCPU builded dll-->
        <file src="Doc\Api.xml" target="lib\netstandard2.0"/>
        <file src="bin\x86\Release\netstandard2.0\Foo.dll" target="lib\netstandard2.0"/>
    
        <!--Path to x86 builded ExternalLib and Foo-->
        <file src="build\x86-Release\ExternalLib.dll" target="runtimes\win-x86\native" />
        <file src="bin\x86\Release\netstandard2.0\Foo.dll" target="runtimes\win-x86\native" />
    
        <!--Path to x64 builded ExternalLib and Foo-->
        <file src="build\x64-Release\ExternalLib.dll" target="runtimes\win-x64\native" />
        <file src="bin\x64\Release\netstandard2.0\Foo.dll" target="runtimes\win-x64\native" />
    
        <!--Path to x64 builded ExternalLib(for linux) and Foo(same as windows)-->
        <file src="build\x64-Release\ExternalLib.so" target="runtimes\linux-x64\native\ExternalLib.dll.so" />
        <file src="bin\x64\Release\netstandard2.0\Foo.dll" target="runtimes\linux-x64\native" />
      </files>
    </package>
    

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多