.NET Core + .NET 4 进程中并行执行?

2024-01-01

在 Windows 上运行时,.NET Core 进程是否支持并行执行 .NET 4,如下所述:https://learn.microsoft.com/en-us/dotnet/framework/deployment/in-process-side-by-side-execution https://learn.microsoft.com/en-us/dotnet/framework/deployment/in-process-side-by-side-execution

Thanks


如果您正在根据引用的文档寻求“并排”:

安装新版本的 .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)还是有可能的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Core + .NET 4 进程中并行执行? 的相关文章

  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐