簡體   English   中英

在.NET 4.6項目中引用.NET Core Library

[英]Reference a .NET Core Library in a .NET 4.6 project

也許我對“.NET核心庫”的含義缺乏了解,但是當我嘗試使用Visual Studio 2015在.NET 4.6程序集中添加.NET核心庫時,我收到錯誤:

無法添加對“...”的引用。

我明白了什么問題嗎?

這是我在.NET Core程序集的project.json中配置的

"frameworks": {
   "net451": { },
   "dotnet5.4": {
     "dependencies": {
     "Microsoft.CSharp": "4.0.1-beta-23516",
     "System.Collections": "4.0.11-beta-23516",
     "System.Linq": "4.0.1-beta-23516",
     "System.Runtime": "4.0.21-beta-23516",
     "System.Threading": "4.0.11-beta-23516"
  }
}

現在可以使用.Net Core RC2完成此操作。 方法如下:

  1. 確保您的.Net RC2項目的project.json配置為包含相關的.net框架。 例如,本節引用.Net 4.51,該版本可以由任何與此版本相同或更高的框架引用:

例:

"frameworks": {
  "net451": { },
  "netstandard1.5": {
  "dependencies": {
    "NETStandard.Library": "1.5.0-rc2-24027"
  },
  "imports": [
    "portable-net45+wp80+win8+wpa81+dnxcore50",
    "portable-net451+win8"
  ]
 }
},
  1. 將RC2應用程序打包為Nuget包。 我還沒有看到如何從Visual Studio中執行此操作,但可以從命令行執行以下操作:

    dotnet pack -oe:\\packages

如果要在每個構建時更新它,可以將以下內容添加到project.json文件中,該文件會自動將包更新到父目錄中:

"scripts": {
  "postcompile": [
    "dotnet pack --no-build --configuration Debug -o ..//..//..//packages"
]}
  1. 將Nuget包添加到.net 4.6應用程序中。 這可以通過幾種方式完成。 一種簡單的方法是將保存包的位置添加為packaage源引用。

  2. 每次構建時增加project.json文件中的版本號,以確保其他應用程序看到更新。

答案顯示在演示文稿中

僅使用尚未發布的ASP.NET Core RC 2,將添加對csproj中引用xproj的支持。

更改您的類庫(以及任何依賴項)以構建4.6以及.NET Core;

更改類庫以構建

現在,這將為您構建類庫的兩個版本。

兩個版本的Debug文件夾

在.NET 4.6項目(App)中,然后添加對調試文件夾中找到的類庫DLL的直接引用

添加直接參考

您現在可以導入此命名空間,並針對它進行構建。 雖然ReSharper(2016.3 EAP 2)似乎感到困惑,並將這些線條標記為紅色 - 但這是一個止損,直到.NET發布后期。

如果打開應用程序項目文件(.csproj),您將看到框架添加的引用。

在此輸入圖像描述

注意:構建代碼dnx462似乎不起作用,抱怨.NET框架沒有安裝,即使該項目有一個4.6.2 WPF應用程序。

我找到了一個非常簡單的解決方案,如果您不介意對Debug或Release的引用進行硬編碼。 您只需在csproj文件中手動添加對xproj的引用。 這是你如何做到的:

  1. 確保您的csproj至少使用一個nuget包。 大多數項目都有,所以這不是問題。
  2. 在Visual Studio中,卸載csproj項目
  3. 在Visual Studio中,右鍵單擊csproj文件並選擇“編輯”
  4. 在csproj項目文件中找到您引用nuget包的部分。 啊......這是一個:

      <Reference Include="Microsoft.CodeAnalysis, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> <HintPath>..\\packages\\Microsoft.CodeAnalysis.Common.1.3.0\\lib\\net45\\Microsoft.CodeAnalysis.dll</HintPath> <Private>True</Private> </Reference> 
  5. 復制它並修改它以引用xproj項目生成的DLL,如下所示:

      <Reference Include="HighFive.Server.Web"> <HintPath>..\\HighFive.Server.Web\\bin\\Debug\\net461\\HighFive.Server.Web.dll</HintPath> <Private>True</Private> </Reference> 
  6. 保存並關閉csproj文件
  7. 重新加載項目
  8. 重建所有
  9. 普雷斯托!

關於硬編碼調試或發布參考:對於單元測試項目,這不是問題,因為您通常在調試模式下執行單元測試。 我相信使用MSBuild參數可以更聰明地避免硬編碼,但我還不需要這樣做。

我一直在努力解決這個問題,但是找到了比繁瑣的nuget包解決方案更好的解決方案。 我在Stackify上找到了這個。 這篇文章只討論了一個單獨的解決方案,但只使用一個解決方案很容易。

.NET項目的單獨解決方案

這個選項需要使用.NET核心和.NET 4.xx為每個項目提供兩個解決方案文件和兩個項目文件。首先創建一個新的空白解決方案。 接下來創建一個新的Windows“類庫”(你的名字在這一點上並不重要)。 從解決方案中刪除它,以便您可以編輯.csproj文件。 打開.csproj文件,並將AssemblyName XML元素更改為.NET核心項目程序集名稱。 您現在應該對項目進行任何其他名稱相關的更改。 關閉.csproj並將其重命名為.xproj文件。 將其復制到.xproj文件所在的文件夾中。

既然你的新閃亮的.csproj文件准備好了,這就是魔術發生的地方。 創建一個名為ProjectName.project.json的文件並將其添加到其中(根據需要修改.net框架)

{ "runtimes": { "win": {} }, "frameworks": { "net461": {} }}

在.NET 4.xx解決方案中,重新加載此修改后的.csproj,您可以添加源文件。 我發現最簡單的方法是按“顯示所有文件”,然后在每個文件/文件夾的右鍵單擊上下文菜單中單擊“包括在項目中”。 現在嘗試構建.csproj,它應該構建良好。 如果這不能正確構建,請嘗試重新加載項目,或重新啟動visual studio。

相同的解決方案,但兩個項目

這與前一個相同,但有一些關鍵的區別。 .csproj文件的名稱必須與.xproj的名稱不同(我剛添加了一個后綴,如MyProjectName.win.csprojMyProjectName.win.project.json )。 這些可以添加到同一解決方案中,而不會發生名稱沖突。 您甚至可以使.csproj中的AssemblyName元素與.NET核心程序集名稱相同,因為輸出文件夾會根據.NET版本而更改

最后的想法

我發現這個解決方案比nu-get包選項好得多。 要考慮的唯一小問題是必須對任何引用,nu-get包或任何新文件的所有修改都添加到兩個項目中; 不過,這是一個很小的代價,以避免可怕的nu-get包選項。 讓我們交叉一下,希望VS團隊能夠盡快獲得.cspoj文件中的.xproj引用。

我知道我不應該發布鏈接,但是我想在它到期的地方給予信任。 http://stackify.com/using-both-xproj-and-csproj-with-net-core/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM