首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将暴露在COM-interop中的.NET对象标记为单线程?

如何将暴露在COM-interop中的.NET对象标记为单线程?
EN

Stack Overflow用户
提问于 2010-01-19 09:46:24
回答 1查看 4.3K关注 0票数 7

在C++中定义COM可见类时,我可以在头文件( threading(single)行)中定义受支持的线程模型:

代码语言:javascript
复制
[
    coclass,
    default(IComInterface),
    threading(single),
    vi_progid("Example.ComClass"),
    progid("Example.ComClass.1"),
    version(1.0),
    uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD")
]

是否有类似的方法在.NET中设置线程模型(例如,属性)?目前,我将COM类定义为:

代码语言:javascript
复制
[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]属性标记的自定义注册方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()对于使基本密钥就位很有用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2092523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档