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

NuGet:未添加对运行时文件夹中程序集的引用,nuget,Nuget,我有一个针对两种不同操作系统/框架的项目: net461在Windows和 OSX上的netcoreapp2.0 我想知道如何正确地为NuGet打包。据我所知,我应该可以这样包装它们: /runtimes/win/lib/net461/myassembly.dll /runtimes/osx/lib/netcoreapp2.0/myassembly.dll /lib/net461/myassembly.dll (net461/Windows Comp

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

  • net461
    在Windows和
  • OSX上的netcoreapp2.0
  • 我想知道如何正确地为NuGet打包。据我所知,我应该可以这样包装它们:

    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    
    /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)
    
    /lib/net461/myassembly1.dll                       (net461/Windows Compile and Runtime)
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll   (netcore/Ubuntu Runtime)
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll   (netcore/Win Runtime)
    /ref/netcoreapp2.0/???
    
    当我将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问题:



    更新:我已经整理了一份报告,展示了我正在努力实现的目标。具体请参见自述文件的底部,标题为“NuGet Package”。

    您是否可以尝试将.NET标准2.0作为目标,而不是net461和netcoreapp2.0?基于netstandard2.0构建的库应该与.NET Core 2.0和.NET Framework 4.6.1配合使用:

    我花了相当多的时间在Visual Studio for Mac和VS代码中的OSX上尝试您的项目。我会尽量坚持事实观察,而不会陷入“为什么你不改做X”

    • runtimes/{rid}/lib/{tfm}/*.dll
      路径看起来正常
    • target=“lib/{tfm}/…”
      程序集被自动引用,而运行时/…不被引用
    • 使用
      netstandard
      的目标框架似乎可以使您的包在
      netcoreapp
      netstandard
      项目中工作(例如,使用
      target=“lib/netstandard1.6/…”
      )。比较
    • runtimes/
      似乎适用于运行时加载的平台相关程序集。例如,
      runtimes/win-x64/native/
      runtimes/win-x86/native/
      )中的32/64位本机程序集加载了()
    • 为Windows和OSX使用单独的SLN,或参考平台无关项目(如)的单独平台特定项目,可以避免一些配置纠纷
    • 我没有找到关于
      target=“ref/…”
      的文档,但是您可以添加(在nuspec
      块中)
    • 打包的程序集不会出现在输出目录中,但当准备使用
      dotnet publish进行分发时,它们将被包括在内:

    您是否使用新的csproj格式?如果是这样,它已经内置了对多个目标框架的支持

    例如,对包含以下内容的.csproj文件运行
    dotnet pack

    <Project Sdk="Microsoft.NET.Sdk">    
      <PropertyGroup>
        <TargetFrameworks>net461;netcoreapp2.1;netstandard2.0</TargetFrameworks>
      </PropertyGroup>    
    </Project>
    
    
    net461;netcoreapp2.1;netstandard2.0
    
    将生成适用于.NET Framework 4.6.1、.NET Core 2.1和.NET Standard 2.0的.nupkg


    然后,可以使用各种技巧为每个框架包含特定的部分,具体取决于可用的部分。

    .NET Core和.NETSTANDARD不将依赖项复制到输出目录,它们使用deps.json进行映射,deps.json指向本地NuGet缓存的相对路径。

    这是我最后发现/猜测的(因为据我所知,其中一些没有官方文件)

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

    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    
    /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)
    
    /lib/net461/myassembly1.dll                       (net461/Windows Compile and Runtime)
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll   (netcore/Ubuntu Runtime)
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll   (netcore/Win Runtime)
    /ref/netcoreapp2.0/???
    

    我正试图解决同样的问题。 你提出的解决方案很好,但有一个问题。。。 Win和net46的情况很清楚。现在,我需要为Win和Linux的netcoreapp在项目中添加对程序集的引用。问题是,这是一个同名的不同程序集。我的包中的程序集如下所示:

    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    
    /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)
    
    /lib/net461/myassembly1.dll                       (net461/Windows Compile and Runtime)
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll   (netcore/Ubuntu Runtime)
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll   (netcore/Win Runtime)
    /ref/netcoreapp2.0/???
    
    更新:实际上,myassembly1.dll和myassembly2.dll都被称为myassembly.dll。但是为了说明其中一个是为Windows组装的,第二个是为Linux组装的,我将在这里留下这样的名称

    最有趣的是,我尝试将任何程序集放在文件夹ref中,它可以在Windows和Linux上运行。 此版本适用于两个系统

    /lib/net461/myassembly1.dll   
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll 
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll  
    /ref/netcoreapp2.0/myassembly1.dll
    
    这个是t