2017-02-01 220 views
3

我有一个包含两个项目的解决方案。第一个项目叫做Library1,它引用了名为Referencelibrary的项目二。我试图在Library1的nuget包中嵌入ReferenceLibrary的DLL,这样我就不必发布2个单独的nuget包。我已经能够嵌入ReferenceLibrary的DLL到NuGet包(看起来是),通过添加条目下面进入我的csproj文件:在nuget包中包含引用的项目DLL [.Net Core RC3 * .csproj文件]

<ItemGroup> 
    <ProjectReference Include="..\ReferenceLibrary\ReferenceLibrary.csproj"> 
     <ReferenceOutputAssembly>true</ReferenceOutputAssembly> 
     <IncludeAssets>ReferenceLibrary.dll</IncludeAssets> 
     <IncludeAssets>ReferenceLibrary.pdp</IncludeAssets> 
    </ProjectReference> 
    </ItemGroup> 

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

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

;)

+0

“这样我就不必发布2个独立的nuget包”:为什么这对你来说如此重要? –

+0

此问题的任何更新?你能从Leo的建议中获得有用的信息吗? –

+0

嗨Jeroen,因为我通常对我的所有代码使用分层的方法。我经常做的事情是将我的数据访问层与其他层分开。因此,在这种特定情况下,我不想发布单独的存储库nuget软件包。 – Zorthgo

回答

2

我们不能包含引用的项目DLL与三个或以上的项目。

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

如果要嵌入的ReferenceLibrary的DLL文件分享帮助的NuGet包内,并参考测试应用程序的项目,你可以添加ReferenceLibrary项目基准测试应用程序项目中添加引用项目分享帮助集ReferenceLibrary后.DLL为LIBRARY1专案的依赖,你可以添加下面的条目为Library1.csproj,然后打包分享帮助并安装该软件包通过的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包并将目标设置为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。

+0

嗨,狮子座,谢谢你的回复。当我今天晚些时候回家时,我必须检查一下。 ;) – Zorthgo

+0

我尝试使用HintPath,因为您已经在上面了,但是我仍然遇到了以前在运行.Net Core控制台应用程序时遇到的System.IO.FileNotFoundException。 :( – Zorthgo

+0

@Zorthgo,我上面已经更新了我的答案,请在免费时检查一下,如果您有任何更新,请告诉我,希望对您有所帮助。 –

2

这似乎是一个已知的限制内置的NuGet包装在Visual Studio 2017年核心项目,并在这里讨论:

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。

相关问题