[英]Mixing .NET 3.5 with 4/4.5 assemblies in the same process
我想將基於.NET 3.5 WinForms的應用程序遷移到最新的.NET版本(4.5)。
該應用程序使用“外部”組件(可以被認為是插件),這些組件目前也是基於.NET 3.5的。
我想知道在我們只使用.NET 4.5轉換應用程序進行編譯的情況下使用了什么運行時/核心庫?
這種情況應該適當嗎? (在4.5進程中加載.NET 3.5程序集)? *插件程序集通過反射加載。
CLR運行時如何處理這種情況? 這是一種安全的做法嗎?
如果您將應用程序的主要EXE重新編譯為目標.NET 4.x或使用帶有<supportedRuntime>
元素的app.exe.config文件來強制使用CLR版本4,那么您可以毫不費力地使用這兩個.NET 3.5和.NET 4.0程序集。 CLR v4在讀取3.5組件時沒有問題,它向后兼容。 不是相反,CLR v2無法讀取版本4程序集,這就是為什么你需要.config文件,如果你的EXE不是針對v4。
唯一的缺點是3.5程序集對舊框架程序集的依賴關系。 例如,它會詢問mscorlib.dll的2.0.0.0版。 CLR會自動轉換這些請求,並將其替換為4.0.0.0版。 一般情況下,標准的4.0框架組件與舊版本非常兼容。
然而,微軟確實借此機會將4.0作為一個新的並排版本並修復了無法輕易修復的舊錯誤,而不會有破壞意外依賴於錯誤行為的代碼的風險。 它們是非常模糊的錯誤,並且這些錯誤修復很可能會對您產生影響。 但是,您必須重新測試您的代碼以確保。
所有程序集都將使用.NET Framework中的應用程序目標類型。
這是一個簡單的測試:
項目' Net2Library '是一個.NET Framework 2.0類庫,包含以下類:
using System;
using System.Collections.Generic;
namespace Net2Library
{
public class Class1
{
public static List<string> GetStrings()
{
var strings = new List<string>();
Console.WriteLine("From Net2Library: {0}", strings.GetType().AssemblyQualifiedName);
return strings;
}
}
}
Project'Net4Application '是一個.NET Framework 4.0控制台應用程序 ,它引用Net2Library.dll並具有以下類:
using System;
using Net2Library;
namespace Net4Application
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("From Net4Application: {0}", Class1.GetStrings().GetType().AssemblyQualifiedName);
}
}
}
控制台輸出將是:
來自Net2Library:System.Collections.Generic.List`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089來自Net4Application:System.Collections.Generic.List`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089
您還可以查看以下資源: .NET Framework程序集統一概述和程序集綁定重定向 。
如果從4.5可執行文件引用3.5程序集,則兩個程序集都將在4.5的CLR環境中運行。 但是,3.5程序集將針對v3.5庫而不是v4.0(盡管4.0庫將具有與3.5相同的所有功能,以及更多)。
所以,至少根據我的經驗,如果你想要針對2.0-3.5的程序集和其他目標4.0-4.5的程序集,你需要在客戶端計算機上安裝3.5和4.5框架版本。 3.5完全向后兼容回2.0,因此你可以在一個環境中運行3.5,3.0和2.0。 4.0-4.5與大多數舊代碼兼容,但有一些重大變化(CAS是我最近偶然發現的一個案例),你必須明確地定位4.0(或設置一個SupportedRuntime app.config鍵)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.