從完整的框架項目中引用 .NET 5.0 程序集?
我們的所有產品(WPF 應用程序)仍在使用 v4.6.1,這有點落後於時代。我目前正在“玩” .NET 5,並將我們的一個類庫(許多這些產品使用)轉換為 v5。我現在試圖從我們的一個較小的產品中引用這個程序集,但它沒有建構,有很多錯誤,例如:
依賴“System.Runtime,版本=5.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”。1> 無法解析此引用。找不到程序集“System.Runtime,Version=5.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”
我的印像是 .NET 5 向後兼容,還是僅適用於 .NET Standard?(TBH 我一直在努力理解整個 .NET Standard/Core 的事情)。
我們還不想冒險將產品轉換為 .NET 5 - 這是一個長期戰略。在我們開始時準備好轉換上述類庫會很好,那麼.NET 框架解決方案有什麼方法可以引用 .NET 5 程序集嗎?我猜這是不可能的,唯一的選擇是多目標?如果是這樣,我該怎麼做,它會回到 v4.6.1 嗎?或者我們是否堅持將所有內容同時轉換為 .NET 5 的“大爆炸”方法?
不確定它是否相關,但在
\bin\debug\類庫的文件夾中我可以看到各種子文件夾,例如net5.0,net5.0-windows,net472,netstandard2.1- 僅net5.0-windows包含建構的 DLL。如果這是最低限度,我們也許可以使用 4.7.2,但我不知道如何首先進行多目標。在“目標框架”下拉列表中,我只看到 .NET 5.0、.NET Core 3.0、.NET Core 3.1。編輯 1
我按照以下 Camilo 的建議替換為:
<TargetFrameworks>net5.0-windows;net461</TargetFrameworks>現在,程式碼將無法建構。看一個例子,它似乎在抱怨它可以找到 .Net5 但不是 4.6.1 的類型“ItemsControl”:
我假設我需要以某種方式為 v4.6.1 添加 System.Windows.Controls,儘管這充其量是不直覺的 - 因為沒有在 .Net 框架應用程序中找到的 Add Reference -> Assemblies 視窗。我假設現在必須通過 NuGet 完成,如果需要,我需要哪個包?
.NET Standard 2.0 是最後一個與 .NET Framework 兼容的目標框架。.NET Standard 2.1 只有 .NET Core 3.0 和更新版本。.NET 5 與 .NET 5 和更新版本(當它們出現時)兼容。
請注意 WPF 埠在 .NET Core 3.0 中可用,這就是為什麼您不能針對低於它的任何版本。
讓我們看看一些選項:
- 類庫包含與框架無關的實用程序類、配置和類似的東西。
該庫應以 .NET Standard 2.0 為目標:
<TargetFramework>netstandard2.0</TargetFramework>
- 類庫有一些依賴於框架的引用(如 WPF),並且您想要多目標。
該庫將面向 .NET Framework 4.6.1 和 .NET 5:
<TargetFrameworks>net461;net5.0</TargetFrameworks>請注意,您可能需要
#if在許多地方添加指令,例如(但是,不要在標識符上引用我):#if NET461 // something that only exists in .NET Framework 4.6.1 #elif NET50 // something that only exists in .NET 5.0 #endif您可能面臨的另一個問題是在其中一個目標中找不到引用。在這種情況下,您可以有條件地導入引用(您可以查看 Microsoft Docs 文件中的類以找到它所在的庫),如下所示:
<ItemGroup Condition="'$(TargetFramework)' == 'net461'"> <Reference Include="PresentationCore" /> </ItemGroup>
- 類庫有一些依賴於框架的引用(如 WPF),但您不希望多目標或到處放置預處理器指令。
創建第二個項目,僅針對 .NET 5,複製可重用的程式碼部分,並從頭開始無法移動的部分。
