我有一个用 .Net Framework 4.0
编译的应用程序,我想在其中加载一个 WPF UserControl。用户控件是为 .NetFramework 4.8
编译的 dll。
我一直在使用控制台应用程序进行一些测试,并使用 reflection 从 .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);
}
面向 .NetFramework 4.8
的类库 Dll
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
中编译的。
回答1
这是允许的还是我会遇到一些问题?
是的。每个高于 4.0 的 .NET Framework 版本都是 4.0 的就地升级。每个更高版本都会完全替换机器上之前的版本。
您仍然可以使用类库来定位 .NET Framework 4.0,但所做的只是指定您使用的是 .NET Framework 4.0 的 API。但是,如果您正在运行更新的 .NET Framework 运行时,它将运行更新版本的 .NET Framework。基本上,它进入了保留 .NET Framework 4.0 行为的兼容模式,但它实际上是在较新的 .NET Framework 版本上运行。
至于是否以 .NET Framework 4.0 为目标,那是另外一个问题。虽然 Microsoft 确实不再支持 .NET Framework 4.0,但只要使用它的应用程序使用仍受支持的 .NET Framework 版本,就没有理由不能定位 .NET Framework 4.0。主要区别在于无论出于何种原因卡在旧版本上的用户仍然可以使用您的类库,如果您针对更新的版本,那些卡在 .NET Framework 4.0 上的用户(还有 https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/runtime/4.0-4.5)将无法访问您的图书馆。
话虽如此,不建议运行针对不受支持的 .NET Framework 版本的应用程序。有关仍受支持的 .NET Framework 版本的列表,请参阅 https://docs.microsoft.com/en-us/lifecycle/faq/dotnet-framework。这似乎与我刚才所说的相矛盾,但是针对 .NET Framework 4.0 与运行 .NET Framework 4.0 之间是有区别的。