在nuget包[.Net Core RC3*.csproj文件]中包含引用的项目DLL

Zor*_*hgo 4 .net c# visual-studio nuget .net-core

我有一个包含两个项目的解决方案.第一个项目名为Library1,它引用了名为Referencelibrary的项目2.我试图在Library1的nuget包中嵌入ReferenceLibrary的DLL,这样我就不必发布2个独立的nuget包.通过将以下条目添加到我的csproj文件中,我已经能够将ReferenceLibrary的DLL嵌入到nuget包中(看起来似乎如此):

  <ItemGroup>
    <ProjectReference Include="..\ReferenceLibrary\ReferenceLibrary.csproj">
        <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
        <IncludeAssets>ReferenceLibrary.dll</IncludeAssets>
        <IncludeAssets>ReferenceLibrary.pdp</IncludeAssets>
    </ProjectReference>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

但是当我导入nuget包并尝试运行我的测试应用程序时,我得到以下异常:

例外截图 我认为这些DLL已经因为之前加入"IncludeAssets"到的csproj到嵌入式,我是不是能够导入NuGet包,因为它试图引用ReferenceLibrary NuGet包.但在添加这些条目后,它允许我导入它.但现在它在运行时爆炸了.任何帮助将不胜感激.谢谢!

;)

Neo*_*Neo 25

现在这里描述一个更新的解决方法。只需将TargetsForTfmSpecificBuildOutputTarget节点添加到您的.csproj文件中,如下所示。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>
  <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="ResolveReferences">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" />
    </ItemGroup>
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

可以在此处找到包目标中此扩展点的官方文档

然后,您可能还想将该属性添加PrivateAssets="All"ProjectReference元素以禁止该项目在生成的包中显示为 NuGet 依赖项,例如:

<ProjectReference Include="MyNonNugetDependentProject.csproj" PrivateAssets="All" />
Run Code Online (Sandbox Code Playgroud)

  • 这可以很好地确保所需的 DLL 最终位于 nuget 包的 lib 文件夹中,但现在在使用此包时,它会查找具有 DLL 名称的 nuget 包,而不是使用生成的包中的包。 (3认同)
  • @JustAnotherDeveloper,原因是您的 DLL 仍然位于打包过程中生成的结果 nuspec 文件中。要修复此问题,您必须将 PrivateAssets="all" 属性添加到项目引用中(请参阅 github 上的完整示例以及相关答案中的链接)。 (2认同)

Dav*_*urg 7

这似乎是Visual Studio 2017中核心项目的内置NuGet打包的已知限制,在此处讨论:

https://github.com/NuGet/Home/issues/3891

在那个讨论主题中有一个对我有用的黑客:

https://github.com/NuGet/Home/issues/3891#issuecomment-309792369

<ItemGroup>
  <_PackageFiles Include="$(OutputPath)\ReferencedProjectDll.dll">
    <BuildAction>None</BuildAction>
    <PackagePath>lib\net45\</PackagePath>
  </_PackageFiles>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

请注意,您需要更改程序集名称,并且可能还需要更改程序包路径以匹配您正在使用的.NET Framework版本.以上示例适用于4.5但您可能处于更新的4.6.


Leo*_*SFT 2

我们无法将引用的项目 DLL 包含在三个或以上项目中。

\n\n

例如,当项目 Library1 引用项目 ReferenceLibrary 时,ReferenceLibrary.dll 将被添加到 Library1 的引用中。但是,当您将项目 Library1 引用到项目测试应用程序时,只有 Library1.dll 会添加到测试应用程序项目的引用中。引用的项目 DLL \xe2\x80\x9cReferencelibrary\xe2\x80\x9d 将被省略。有关更多详细信息,请参阅灵活的项目到项目参考

\n\n

如果要将 ReferenceLibrary 的 DLL 嵌入 Library1\ 的 nuget 包中并将其引用到测试应用程序项目,则可以在添加引用项目 Library1 后将 ReferenceLibrary 项目引用添加到测试应用程序项目,也可以将 ReferenceLibrary.dll 设置为Library1 项目的依赖,您可以将以下条目添加到 Library1.csproj 中,然后打包 Library1 并通过 NuGet 安装此包来测试应用程序:

\n\n
  <ItemGroup>\n    <Reference Include="ReferenceLibrary, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">\n      <HintPath>..\\packages\\ReferenceLibrary.1.0.0\\lib\\net461\\ReferenceLibrary.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新\xef\xbc\x9a

\n\n

如果我们想将ReferenceLibrary的DLL嵌入Library1的nuget包中,我们应该确保ReferenceLibrary.dll包含在Library1包中,无论我们如何嵌入DLL。因此,当我们打包Library1包并将目标设置为lib文件夹时,可以将ReferenceLibrary.dll作为文件添加到Library1.nuspec中。下面是我的 Library1.nuspec:

\n\n
<?xml version="1.0"?>\n<package >\n  <metadata>\n    <id>Library1</id>\n    <version>1.0.0</version>\n    <authors>xxxx</authors>\n    <owners>xxxx</owners>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <description>Package description</description>\n    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>\n    <copyright>Copyright 2017</copyright>\n    <tags>Test</tags>\n  </metadata>\n     <files>\n        <file src="..\\Library1\\bin\\Debug\\Referencelibrary.dll" target="\\lib\\net461" />\n        <file src="..\\Library1\\bin\\Debug\\Library1.dll" target="\\lib\\net461" />\n     </files>\n</package>\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意:您还需要在 Library1.nuspec 中包含 Library1.dll。

\n