如何将暴露给 COM 互操作的 .NET 对象标记为单线程?

2023-11-21

在 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(使用前将#替换为@)

如何将暴露给 COM 互操作的 .NET 对象标记为单线程? 的相关文章

随机推荐

  • 使用 PHP 将 CSV 转换为 JSON?

    我需要转换一个CSV文件到JSON在服务器上使用 PHP 我正在使用这个有效的脚本 function csvToJSON csv rows explode n csv i 0 len count rows json n data forea
  • 有办法防止 cookie 被盗吗?

    在 Web 2 0 应用程序中 许多用户通常希望保持登录状态 记住我 标志 而另一方面 他们的 cookie 可以访问非常私密的数据 有没有办法防止有人直接从计算机或通过嗅探窃取 cookie 从而使用 cookie 来访问用户的数据 始终
  • “in”运算符或 obj.hasOwnProperty(prop) 的 Big O 表示法的效率是多少

    Mozilla的网站上清楚地描述了hasOwnProperty 和in操作员 但是 它没有提供有关其效率的任何实施细节 我怀疑他们会是O 1 恒定时间 但希望看到任何可能存在的参考或测试 将我的评论变成答案 hasOwnProperty s
  • 使用自己的应用程序打开自定义文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何将文件扩展名与 C 中的当前可执行文件关联 所以 我正在申请学校 最终项目 在这个应用程序中 我有一个Project 班级 这可以保存为自定义文件 例如测试 gpr gpr 是扩展名 如何让 Wi
  • 将静态参数传递给类

    据我所知 你不能将参数传递给 C 中的静态构造函数 但是 在创建类的实例之前 我确实需要传递两个参数并将它们分配给静态字段 我该怎么办 这可能是对 工厂方法的调用 class Foo private int bar private stat
  • Python场景变化检测

    我想知道是否有人有Python和视频处理的经验 本质上 我想知道是否有任何库可以让我在视频中进行场景检测 如果没有 是否有任何可以让我将视频分成一系列帧并让我处理像素 Thanks OpenCV有 Python 绑定 我不认为它有任何内置的
  • 如果我在 PHP 中执行 print_r ,它会以垃圾形式打印数组

    如何以树状格式打印数组 使其更易于阅读 Try pre pre 它将提供 HTML 的空白策略修剪掉的正确树结构
  • Rails 当前页面?当方法为 POST 时“失败”

    我有一个非常简单的问题 我有一页报告 每个报告都有自己的选项卡 我在用着current page 以确定应突出显示哪个选项卡 当我提交任何报告时 current page 似乎不再起作用 显然是因为请求方法是POST 这是预期的行为吗cur
  • 在 OSX Catalina 上安装用于 gem 安装的 Ruby 开发工具

    我知道这个问题有很多例子 我已经完成了这些答案中的所有内容 但 4 小时后却一无所获 我正在尝试在 Catalina 10 15 7 上安装 gem 并获得非常流行的 System Library Frameworks Ruby frame
  • 如何在 WPF 中删除鼠标悬停时按钮的发光

    我在 WPF 中使用一个简单的按钮 我已经在背景上放置了按钮的图像 我的问题是 当我将鼠标指针移动到按钮时 它会获得默认发光并覆盖作为背景给出的图像
  • Hive 中的增量/增量负载

    我有以下用例 我的应用程序有一个表多年数据 in RDBMSD B 我们已经用过sqoop将数据获取到 HDFS 并加载到按以下分区的 hive 表中年 月 现在 应用程序每天都会更新并将新记录插入 RDBMS 表中 这些更新的记录可以跨越
  • powershell 2.0重定向文件处理异常

    我正在寻找解决方案The OS handle s position is not what FileStream expected Do not use a handle simultaneously in one FileStream a
  • 为什么 LINQ 中的 Union 函数不删除重复条目?

    我正在使用 VB NET 我知道 Union 通常按 ByRef 工作 但在 VB 中 字符串通常被视为原始数据类型 因此 问题就在这里 Sub Main Dim firstFile secondFile As String resulti
  • 为什么这个 Perl 6 feed 操作符是一个“虚假语句”?

    我把这个例子取自第 10 天 Perl 6 2010 降临节日历的 Feed 操作员随着轻微的变化 uc为了 ucfirst不再存在了 my rakudo people
  • Angularjs 忽略时区

    有没有更好的方法来忽略 Angularjs 中的时区 2014 01 18 14 30 00 而不是 2014 01 18 15 30 00 function Scoper scope scope datum 2014 01 18T14 3
  • C++ 中的惰性求值

    C 没有对惰性求值的本机支持 如 Haskell 那样 我想知道是否可以以合理的方式在 C 中实现惰性求值 如果是的话 你会怎么做 编辑 我喜欢康拉德鲁道夫的回答 我想知道是否可以以更通用的方式实现它 例如通过使用参数化的惰性类 它本质上适
  • Spring中的Websocket身份验证和授权

    我一直在努力正确实现 Stomp websocket 验证 and 授权与Spring Security 对于后代 我将回答我自己的问题以提供指导 问题 Spring WebSocket 文档 用于身份验证 看起来不清楚 ATM 恕我直言
  • apache上的vue-router,子目录中的SPA,只能通过重定向访问页面

    所以我有一个在 apache 开发服务器上设置的客户端 Vue 应用程序 我这样做是为了配合生产环境 该应用程序位于子目录中 我在 vue router 上设置了 base 选项以进行匹配 如果我导航到我的虚拟主机根目录 它会正确重定向 但
  • 如何获取iframe响应头?

    有没有办法获取 iframe onload 的响应标头 我已经用谷歌搜索过它 但实际上我找不到任何有用的东西 并不真地 如果 iframe 位于同一域中 您可以访问其文档对象 其中包含一些有用的信息 例如document referrer
  • 如何将暴露给 COM 互操作的 .NET 对象标记为单线程?

    在 C 中定义 COM 可见类时 我可以在头文件中定义支持的线程模型 threading single line coclass default IComInterface threading single vi progid Exampl