NuGet:未添加对运行时文件夹中程序集的引用

标签 nuget

我有一个针对两个不同操作系统/框架的项目:

  • net461在 Windows 和
  • netcoreapp2.0在 OSX

  • 我试图弄清楚如何为 NuGet 正确打包。根据this post我应该能够像这样打包它们:
    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    

    当我将 NuGet 包添加到另一个项目时,打包的程序集不会作为对目标项目的引用添加。

    然后我在某处读到您还需要将引用库添加到 /ref文件夹,所以我尝试了这个:
    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    /ref/net461/myassembly.dll
    /ref/netcoreapp2.0/myassembly.dll
    

    在这种情况下,程序集被添加为对目标项目的引用,我可以构建它,但所需的程序集不会复制到输出文件夹。

    所有这一切的文档都非常模糊,我很迷茫。

    我错过了什么?

    相关的 NuGet 问题:https://github.com/NuGet/Home/issues/7316

    更新:我整理了一个 sample project这证明了我正在努力实现的目标。特别是请参阅自述文件的底部,标题为“NuGet Packaging”。

    最佳答案

    这就是我最终想通/猜到的(因为尽我所能知道其中一些没有官方文档)

  • 添加到/runtimes 文件夹的文件不会自动添加为对目标项目的引用。
  • /ref 和/runtime 文件夹应相互结合使用,并且仅用于 .NET Core 目标。尽我所能,.NET Framework 目标显然不支持这些文件夹。
  • /ref 文件夹用于编译时引用,此处添加的任何内容都将作为对目标项目的引用添加。
  • /ref 文件夹中的程序集不需要实现——每个公共(public) API 都可以抛出一个未实现的异常。然而,在实践中,您通常只需复制其中一个实现程序集并将其声明为编译时 API。
  • 我已阅读(但尚未测试自己)/ref 文件夹中的程序集必须是“任何 CPU”构建。如有必要,您可以使用 CorFlags 实用程序为此修补实现程序集。
  • /runtimes 文件夹用于为/ref 文件夹中包含的任何引用提供实现程序集。这些程序集在运行时和部署期间使用。
  • /runtimes 文件夹可以包含仅在运行时需要且客户端项目不需要查看的其他程序集。这些附加程序集不会作为引用包含在目标项目中,但可用于运行/部署。
  • 正如其他人所提到的,/runtimes 文件夹中的文件不会复制到构建的输出文件夹中。而是将配置文件放置在那里,告诉运行时如何从 NuGet 缓存中找到/runtimes 文件。
  • 对于 .NET Framework 目标(即:net461),只需使用/lib 文件夹,因为除了 Windows 之外,没有其他适用于 .NET 的运行时。

  • 把这一切放在一起,我原来的例子应该是这样的:
    /lib/net461/myassembly.dll                       (net461/Windows Compile and Runtime)
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll   (netcore/OSX Runtime)
    /runtimes/win/lib/netcoreapp2.0/myassembly.dll   (netcore/Win Runtime)
    /ref/netcoreapp2.0/myassembly.dll                (netcore/* Compile Time)
    

    关于NuGet:未添加对运行时文件夹中程序集的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52397501/

    相关文章:

    nuget - dotnet 包 : version format

    asp.net-mvc - NuGet web.config.transform问题

    visual-studio - Nuget:所有包都给出 "Failed to generate binding redirects for ' ProjectName'。已添加具有相同 key 的项目。”

    c# - Xamarin - 按 "Add NuGet Packages..."没有任何作用

    c# - DLL 必须位于 nuget 包中的 lib 文件夹中

    .net - 错误 "NU3034 This package is signed but not by a trusted signer"

    servicestack - 为什么 ServiceStack.Text 没有被复制到 Bin?

    NuGet.Server 返回 404 错误

    visual-studio-2012 - 将 NuGet ndef 库添加到 Windows Phone 8 项目

    .net - 如何使用包含辅助方法的 .cshtml 文件创建 nuget 包