最近我升级了一个库以使用.NET6和.NET7,有一些代码将单元状态设置为STA,但我发现设置单元状态是Windows独有的事情.为了让编译器满意,我们将代码更改为

#if NET472
    _thread.SetApartmentState(ApartmentState.STA);
#else
    if (OperatingSystem.IsWindows())
        _thread.SetApartmentState(ApartmentState.STA);
#endif

但这让我想知道,如果这段代码最终在Linux或MacOS平台上运行,一切都会好起来吗?我对单线程单元和多线程单元在Windows中的作用知之甚少,除非你有一个线程应该是单线程运行的,你应该使用STA.我更不明白这些概念是如何转化到Linux和MacOS上的,以及这是否重要.这些操作系统的行为是否总是像它是STA一样,或者它总是像它是MTA一样,或者它根本不重要,因为它的处理方式如此不同,甚至没有意义进行比较,但它仍然可以工作.

我们目前还没有在Linux或MacOS上运行这个库的任何即时用例,但也许有一天我们会这样做,但正因为如此,这可能会在很长一段时间内未经测试.

推荐答案

我并不是这方面的专家,但我可以根据the ApartmentState Enum documentation的 comments 部分中的信息做出一些推论:

NET框架不使用单元,托管对象本身负责以线程安全的方式使用所有共享资源.

由于COM类使用单元,因此在COM互操作情况下调用COM对象时,公共语言运行库需要创建和初始化单元.

这告诉我,该库很可能出于某种目的而使用COM Interop,因此,对于这是否能在MacOS/Linux上工作,答案可能是"不能",因为COM是Windows上的东西.

但再说一次,我不是这方面的专家,也许wine会让我大吃一惊.

Csharp相关问答推荐

使用其可能实现的基类和接口的属性的方法

如何使用while循环实现异常处理

C#DateTime.ToString在ubuntu和centos中返回不同的结果

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

持有者安全定义未显示在Swagger.NET 8中

集合表达式没有目标类型

在两个已具有一对多关系的表之间添加另一个一对多关系

等待一个等待函数

如何将%{v_扩展}转换为%{v_扩展}>>

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

Visual Studio如何使用当前的框架?

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

从MudAutoComplete打开对话框,列表仍然可见

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

用于分钟和秒验证的MudTextfield的正则表达式掩码

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明