如果您正在根据引用的文档寻求“并排”:
安装新版本的 .NET Framework 对现有应用程序没有影响。
应用程序根据构建它们所用的 .NET Framework 版本运行。除非明确指示,否则他们不会使用新版本的 .NET Framework。但是,应用程序更容易过渡到使用新版本的 .NET Framework。
那么答案就是No.
.NET Core 是一个独立的框架,而不是 .NET Framework 的升级版。因此,由于上述原因,在一个进程中并行运行两个 DLL 是不相关的。
有没有一种方法可以在同一进程中托管一个 .NET Framework DLL 和一个 .NET Core DLL?
Yes.
我看到了两种可能的方式:
w3wp.exe
使用时进程内托管 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/?view=aspnetcore-3.1, 可以将 CLR 和 CoreCLR 加载到w3wp.exe https://github.com/dotnet/runtime/issues/13436,但我不知道这是如何运作的。它应该是托管代码世界之外的低级别/运行时级别的东西。
DLL参考
.NET Core 应用程序可以直接引用 .NET Framework 库,只要目标.NET Framework 版本实现 .NET Standard https://learn.microsoft.com/en-us/dotnet/standard/net-standard。例如NET45+。
但是,.NET Framework 代码在 .NET Core shell 中的执行情况与在 .NET Framework shell 中的执行情况不同。
考虑这段代码:
// In .NET Framework library
public class Class1
{
public void Test()
{
var domain = AppDomain.CreateDomain("mydomain");
Console.WriteLine(domain);
}
}
如果您在 .NET Core 应用程序中引用此类型,您可能会看到warning https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu1701但没有编译时错误:
static void Main(string[] args)
{
var class1 = new Class1();
class1.Test();
}
当你运行代码时,你会得到一个异常:
System.PlatformNotSupportedException: 'Secondary AppDomains are not supported on this platform.'
相反,当您在 .NET Framework shell 中运行代码时,您会看到正常的输出:
Name:mydomain
There are no context policies.
Why?
这是因为AppDomain
类型转发到不同的运行时库。
如果打印出类型所在的程序集:
Console.WriteLine(typeof(AppDomain).Assembly);
您可以看到对于 .NET Core,输出为:
System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
而对于 .NET Framework,输出为:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
两者之间我可以进行什么样的沟通?
例如,我可以发送序列化对象吗?两个应用程序域如何通信有类似的情况吗?
根据这个文档 https://learn.microsoft.com/en-us/dotnet/core/porting/net-framework-tech-unavailable、应用程序域和远程处理不受.NET Core支持,因此您无法基于这些技术进行跨域通信。
如果你看一下实施MarshalByRefObject https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib/src/System/MarshalByRefObject.cs在.NET Core中,它只抛出异常。
然而,基于网络的通信(例如gRPC https://github.com/grpc/grpc-dotnet)还是有可能的。