簡體   English   中英

在同一進程中將.NET 3.5與4 / 4.5程序集混合使用

[英]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.

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