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
现在这里描述了一个更新的解决方法。只需将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>
Run Code Online (Sandbox Code Playgroud)
可以在此处找到包目标中此扩展点的官方文档。
然后,您可能还想将该属性添加PrivateAssets="All"到ProjectReference元素以禁止该项目在生成的包中显示为 NuGet 依赖项,例如:
<ProjectReference Include="MyNonNugetDependentProject.csproj" PrivateAssets="All" />
Run Code Online (Sandbox Code Playgroud)
这似乎是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.
我们无法将引用的项目 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>\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n\n请注意:您还需要在 Library1.nuspec 中包含 Library1.dll。
\n| 归档时间: |
|
| 查看次数: |
5145 次 |
| 最近记录: |