我有一个包含两个项目的解决方案。第一个项目名为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包并尝试运行我的测试应用程序时,我得到以下异常:
我假设已经嵌入了DLL,因为在添加&#34; IncludeAssets&#34;之前对于csproj,我无法导入nuget包,因为它试图引用ReferenceLibrary nuget包。但在添加这些条目后,它允许我导入它。但现在它在运行时爆炸了。任何帮助将不胜感激。谢谢!
)
答案 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中描述了一种最新的解决方法。只需将TargetsForTfmSpecificBuildOutput
和Target
节点添加到您的.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包。