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

时间:2017-02-01 12:01:49

标签: c# .net visual-studio nuget .net-core

我有一个包含两个项目的解决方案。第一个项目名为Library1,它引用了名为Referencelibrary的项目2。我试图将ReferenceLibrary的DLL嵌入到Library1的nuget包中,这样我就不必发布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>

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

Exception Screenshot 我假设已经嵌入了DLL,因为在添加&#34; IncludeAssets&#34;之前对于csproj,我无法导入nuget包,因为它试图引用ReferenceLibrary nuget包。但在添加这些条目后,它允许我导入它。但现在它在运行时爆炸了。任何帮助将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:6)

这似乎是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>

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

答案 1 :(得分:2)

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

例如,当项目Library1引用项目ReferenceLibrary时,ReferenceLibrary.dll将被添加到Library1的References。但是当您将项目Library1引用到项目测试应用程序时,只有Library1.dll将添加到测试应用程序项目的引用。引用的项目DLL“Referencelibrary”将被省略。有关详细信息,请参阅Flexible Project-to-Project References

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

  <ItemGroup>
    <Reference Include="ReferenceLibrary, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>..\packages\ReferenceLibrary.1.0.0\lib\net461\ReferenceLibrary.dll</HintPath>
      <Private>True</Private>
    </Reference>
  </ItemGroup>

<强>更新

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

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

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

答案 2 :(得分:0)

现在here中描述了一种最新的解决方法。只需将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>

可以在here中找到此扩展目标的官方文档。

答案 3 :(得分:0)

为了将DLL放入我选择的文件夹中,我使用了at Microsoft中所述的其他自定义点。

所以我得出以下结论:

<PropertyGroup>
  <IncludeBuildOutput>false</IncludeBuildOutput> <!-- omit the package creating library itself -->
  <PackProject>true</PackProject>
  <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);CreatePackNupkg</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<Target Name="CreatePackNupkg">
  <ItemGroup>
    <TfmSpecificPackageFile Include="$(OutputPath)\<whatever>.*.dll">
      <PackagePath>folder/subfolder</PackagePath>
    </TfmSpecificPackageFile>
  </ItemGroup>    
</Target>

以相同的方式(have a look)创建NuGet.Pack包。