在 C++ 中定义 COM 可见类时,我可以在头文件中定义支持的线程模型(threading(single)
line):
[
coclass,
default(IComInterface),
threading(single),
vi_progid("Example.ComClass"),
progid("Example.ComClass.1"),
version(1.0),
uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD")
]
在 .NET 中是否有设置线程模型的类似方法(例如属性)?我目前将 COM 类定义为:
[Guid("67155A91-2948-43f5-B07F-5C55CDD240E5")]
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IComInterface
{
...
}
[Guid("DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Example.ComClass")]
public class ComClass : IComInterface
{
...
}
--edit:
对标记答案的评论是非常重要的。似乎告诉 RegAsm 设置不同的 ThreadingModel 的唯一方法是编写一个标有[ComRegisterFunction]
属性。
这真的很晦涩,我从来没有在 MIDL 中见过“线程”属性。也没有MSDN 库作者.
COM 组件类在注册表中发布其线程要求,使用HKCR\CLSID\{guid}\InProcServer32
钥匙。 ThreadingModel 值声明它需要的单元。如果它丢失或设置为“公寓”,则表明它不是线程安全的,需要 STA 线程的帮助。 CoCreateInstance() 在创建对象时使用该值。如有必要,它将启动一个 STA 线程,并在当前线程不是 STA 时创建一个代理,确保它始终以线程安全的方式使用。
[ComVisible] .NET 类将被注册为“Both”,表明可以在 MTA 中的线程上使用它。相当乐观,但遵循 .NET 哲学,即一切都是线程不安全的,但可以通过将lock
关键字放在正确的位置。顺便说一句,一个不经常被测试的承诺是有风险的。重写 ThreadingModel 值(或省略它)需要编写代码来自己注册组件类,并用 [ComRegisterFunction] 属性进行修饰。 RegistrationServices.RegisterTypeForComClients() 对于将基本密钥设置到位非常有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)