加载使用更新的 .Net Framework 编译的程序集而不是执行程序集

Load Assembly compiled with newer .Net Framework than executing assembly

我有一个用 .Net Framework 4.0 编译的应用程序,我想在其中加载一个 WPF UserControl。 用户控件是为 .NetFramework 4.8.

编译的 dll

我一直在用控制台应用程序做一些测试,我已经使用反射从 .NetFramework 4.0 加载了一个 dll。该 dll 使用 .NetFramework 4.8 编译,并使用例如 .NetFramework 4.7

中引入的 RSA 构造函数

控制台应用程序定位 .NetFramework 4.0

static void Main()
{
    var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "DependencyDll.dll");
    var assembly = Assembly.LoadFile(path);
    var type = assembly.GetType("Crypto");
    var typeInstance = Activator.CreateInstance(type);

    var method = type.GetMethod("Encrypt");
    var text = (string) method.Invoke(typeInstance, new object[]{"Hellooooo"});
    Console.WriteLine(text);
}

Class 库 Dll 目标 .NetFramework 4.8

public class Crypto
{
    public string Encrypt(string text)
    {
        using(var rsa = RSA.Create(2048))
        {
            var bytes = rsa.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.OaepSHA512);
            var decrypt = rsa.Decrypt(bytes, RSAEncryptionPadding.OaepSHA512);
            return Encoding.UTF8.GetString(decrypt);
        }
    }
}

在这个例子中,似乎一切都运行良好,在运行时没有问题。 这是允许的还是我会遇到一些问题?我认为这将失败,因为执行或调用程序集是在 .Net Framework 4.0.

中编译的

Is this permited or maybe I will have some problem?

是的。每个高于 4.0 的 .NET Framework 版本都是 4.0 的 in-place 升级。每个更高的版本都会完全替换机器上之前的版本。

您仍然可以使用 class 库 target .NET Framework 4.0,但所做的只是指定您使用的是 [= .NET Framework 4.0 的 34=]。但是,如果您运行使用更新的 .NET Framework 运行time,它将 运行 更新的 .NET Framework 版本。基本上,它进入了保留 .NET Framework 4.0 行为的兼容模式,但实际上 运行 在较新的 .NET Framework 版本上。

至于是否目标.NET Framework 4.0,那是另外一回事了。虽然 Microsoft 确实不再支持 .NET Framework 4.0,但绝对没有理由不能将 .NET Framework 4.0 作为目标,只要使用它的应用程序使用的是仍然受支持的 .NET Framework 版本。主要区别在于无论出于何种原因停留在旧版本上的用户仍然可以使用您的 class 库,如果您以更新的版本为目标,那些停留在 .NET Framework 4.0 上的用户(并且有plenty of possible reasons why this could occur) 将无法访问您的图书馆。

也就是说,不建议 运行 面向不受支持的 .NET Framework 版本的应用程序。有关仍受支持的 .NET Framework 版本的列表,请参阅 https://docs.microsoft.com/en-us/lifecycle/faq/dotnet-framework。这似乎与我刚才所说的相矛盾,但是 targeting .NET Framework 4.0 与 运行ning .NET 之间是有区别的框架 4.0.