2017-02-01 109 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。

相關問題