gpt4 book ai didi

c# - 公开一个类作为 STA COM

转载 作者:太空狗 更新时间:2023-10-30 00:28:21 34 4
gpt4 key购买 nike

我有一个小的 c# 类需要公开为 COM。将使用 COM 对象的工具要求我支持 STA。我需要对 COM 对象做些什么特别的事情吗?

(我知道 STAThread 属性,但是(除非我错了)它用于指示 .net 中的执行线程要与 STA 兼容,而不是用于指示我的 COM 对象需要兼容) .

到目前为止,这是我的声明。您看到我需要添加的内容了吗?


[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ITestClass1))]
[Guid("093A3701-2C53-4A31-97C5-0F3C205E5B4C")]
public class Class1: ITestClass1 {..}

[ComVisible(true)]
[Guid("8D52F785-CDD8-4248-8AB7-97B8C19DE59B")]
public interface ITestClass1 {..}

最佳答案

COM 服务器使用名为 ThreadingModel 的注册表项来公布它所需的线程模型。如果注册表项丢失或设置为“公寓”,单线程是默认值。

Regasm.exe 将此键设置为“两者”。这意味着您的服务器被声明为与 STA 线程和 MTA 线程兼容。在某种程度上与 .NET 代码保持一致,它支持线程,但要求您必须注意线程安全。改变这个很尴尬,你必须自己编写注册程序并用 [ComRegisterFunction] 属性注释它。

简单的方法是将键设置为“Both”并在类构造函数中检查单元状态。使用 Thread.GetCurrentThread().GetApartmentState()。如果你得到 MTA 然后抛出一个异常告诉客户端你不支持多线程。许多 .NET 类都这样做。

关于c# - 公开一个类作为 STA COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282463/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com