在C++中定义COM可见类时,我可以在头文件( threading(single)行)中定义受支持的线程模型:
[
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
{
...
}--编辑:
对标记的答案的评论是真正重要的事情。告诉RegAsm设置不同ThreadingModel的唯一方法似乎是编写一个使用[ComRegisterFunction]属性标记的自定义注册方法。
发布于 2010-01-19 11:16:25
这很难理解,我从未见过MIDL中的“线程”属性。MSDN图书馆作者也没有。
COM coclass使用HKCR\CLSID\{guid}\InProcServer32键在注册表中发布其线程需求。ThreadingModel值声明它需要的公寓。如果它丢失或设置为“单元”,则宣布它不是线程安全的,并需要STA线程的帮助。CoCreateInstance()在创建对象时使用此值。如果有必要,它将启动STA线程,并在当前线程不是STA的情况下创建代理,确保它总是以线程安全的方式使用。
ComVisible .NET类将注册为“两者”,这表明可以在MTA中的线程上使用它。非常乐观,但遵循.NET的理念,即所有东西都是线程不安全的,但可以通过将lock关键字放在正确的位置来实现安全。一个不常被考验的承诺,冒险的。重写ThreadingModel值(或忽略它)需要编写代码来自己注册coclass,并使用ComRegisterFunction属性进行修饰。RegistrationServices.RegisterTypeForComClients()对于使基本密钥就位很有用。
https://stackoverflow.com/questions/2092523
复制相似问题