2016-06-18 41 views
19

我想:如何製作.NET Core類庫並從.NET 4.6項目中引用它?

  • 做一個類庫,它定義了一些界面和簡單的通用助手類。它將依靠通用集合和IQueryable<T>,但沒有第三方依賴關係(好吧,JetBrains.Annotations)。
  • 能夠從任何地方引用該類庫(特別是UWP,net46和ASP.Net Core RC2)
  • 理想情況下,儘可能使用project.json系統,儘管如果需要的話我會做出犧牲。
  • 發佈成品庫到的NuGet飼料,並從那裏用它在其他應用

當建立在Visual Studio 2015.2我的類庫項目,我發現Class Library (.NET Core)模板,其中規定

創建類庫作爲NuGet包的項目模板,可以定位任何平臺

任何平臺!輝煌......但我無法讓它工作。很多擺弄後,我公司目前有以下project.json(我可能已經完全被打破,現在它):

{ 
"title": "My Really Useful Class Library", 
"copyright": "Copyright © 2015-16 Tigra Astronomy, all rights reserved", 
"description": "Really neat stuff", 
"language": "en-GB", 
"version": "1.0.0-*", 
"dependencies": { 
    "JetBrains.Annotations": "10.1.4", 
    }, 
"frameworks": { 
    "netstandard1.5": { 
     "imports": "dnxcore50", 
     "dependencies": { 
      "NETStandard.Library": "1.5.0-rc2-24027", 
      "System.Linq.Expressions": "4.0.11-rc2-24027" 
      } 
     } 
    "net46": { 
     "frameworkAssemblies": { 
      "System.Collections": "4.0.*" 
      }, 
     "dependencies": {} 
     } 
    }, 
    "buildOptions": { 
     "xmlDoc": true 
     } 
} 

我做的下一件事是在同一個解決方案創建我的.NET Framework 4.6的項目,嘗試引用類庫。它讓我添加參考,但我得到生成錯誤,未解決的符號,R#是不開心,等等。

我想我沒做對(沒有意外,真的,因爲我在摸索中黑暗)。

我讀過一些關於TFMs,框架和庫的文檔,但沒有一個真正有意義。

我真的需要在我的課程庫project.json中放入什麼東西,以便我可以從我的.net framework 4.6應用程序以及UWP和ASP.NET Core RC2應用程序中引用它?這真的是正確的做法,還是我開始走錯了路?

+0

請原諒我沒有選擇'正確'的答案呢。我仍在通過升級到最新RTM版本和最新預覽工具的許多方案。 –

+1

確保在cs proj中檢查了 StingyJack

回答

3

新項目模板/ .xproj的工作原理有點不同。新的類庫(和應用程序模板)生成nuget包,而不是普通的程序集。

在那個nuget包中,所有的目標都被打包進去。話雖如此,您添加新項目的方式與添加其他nuget軟件包的方式相同:將nuget放入Nuget Feed中,在Visual Studio中引用此項,然後從此處獲取它。

如果您沒有運行Nuget服務器(Visual Studio Team Services + NuGet包,myget,自託管),您也可以將這些包放入一個文件夾(本地或網絡共享)並將此文件夾添加爲nuget源。

如果這「工作太多」,也可以在一個文件夾中創建兩個項目:* .csproj和* .xproj。 * .csproj的目標是.NET 4.6框架,* .xproj保持如上所述並有多個目標。通過這種設置,您通常可以按照以前使用的方式(如果它們處於相同的解決方案中)引用項目,只需添加一個參考即可。

+3

默認情況下,新模板不會生成nuget軟件包。這是DNX/RC1的一部分,但RC2項目模板不會在VS中自動執行此操作。你必須運行'dotnet pack'來創建軟件包。 –

35

現在有兩種創建C#項目的方式:xprojcsproj。假設我們對它們都使用project.json,對於項目類型,這仍然有不同的效果 - 對於xprojproject.json包含構建項目所需的一切;對於csproj,它只包含nuget依賴關係。

也就是說,有些項目類型(如UWP)不能用xproj構建,因爲需要比支持更復雜的構建管道。 (順便說一句,這是一個關鍵的原因搬回的MSBuild。)

也有創造一個基於標準的.NET類庫的兩種方法:你可以使用xprojproject.json,因爲你所做的,或者你可以創建一個常規csproj「便攜式類庫」項目。使用VS 2015 Update 3 RC,您可以將PCL更改爲.NET Standard版本(netstandard1.x而不是PCL配置文件,259等)。

如果您使用基於csproj的類庫來定位netstandard1.x,那麼在添加項目引用時,事情應該適合您。請注意,根據platform map,UWP目前支持最多netstandard1.4。面臨的挑戰是如果您想要使用基於xproj/project.json的項目。今天使用xproj的一個關鍵原因是能夠在多個目標框架之間進行交叉編譯。也就是說,從您的項目中創建多個輸出。這與創建可從任何兼容項目引用的單個輸出不同。兩者都有其用途,這取決於您的需求。

如果您決定創建一個基於xproj的類庫,如果「添加引用」對話框不工作(它不會工作),您可以使用一種解決方法從UWP項目或任何其他兼容項目類型引用它't爲csproj - >xproj已經非常糟糕了)。除了使用對話框中,編輯您UWP csproj指向xproj這樣的輸出:

<Reference Include="System.Reactive.Interfaces"> 
    <HintPath>..\System.Reactive.Interfaces\bin\$(Configuration)\netstandard1.0\System.Reactive.Interfaces.dll</HintPath> 
</Reference> 

上面的代碼從Rx.NET UWP測試運行here

如果你這樣做拍攝,您還需要將UWP項目的構建依賴項添加到您的xproj中,因爲MSBuild/Visual Studio不會了解它並以錯誤的順序構建內容。爲此,請右鍵單擊解決方案資源管理器中的UWP項目,然後選擇「構建依賴項 - >項目依賴項」。在該對話框中,選中xproj的複選框,以確保VS/MSbuild知道首先創建一個。

您可以在這裏看到完整的Rx.NET解決方案,其中包括xproj->xproj參考文獻和我在上面提到的UWP - >xproj參考文獻。

+0

謝謝Oren,現在開始有所瞭解。我也可以開始理解MS爲什麼說「等待新工具」。也許我應該嘗試VS2015.3 RC ...我可能確實希望我的庫最終在IoT Core下工作在基於UWP/ARM的目標上,因此我希望使用xproj。 –

+2

如果您的目標是與UWP和ASPNet Core 1.0兼容,並且您只需要一個輸出,那麼最簡單的方法可能是一個'csproj',它的目標'netstandard1.4'。你不需要'xproj'來實現這一點,而項目到項目的引用更容易。 –

+0

哦,事實上,我可以看到2015年更新2中的鏈接... 2015.3 RC值得在這個階段安裝嗎?因爲它是一個RC,它應該是相當穩定的... –

相關問題