指定实例化进程外COM对象时使用的公寓状态

本文关键字:公寓 状态 对象 实例化 进程 COM | 更新日期: 2023-09-27 17:52:15

我在。net中创建了一个COM对象,并使用regsvcs将其注册为一个COM+服务器应用程序,池= 1。我目前正在寻找一个bug,因此需要确保这个COM对象在STA中运行,而不是MTA。我该如何指定呢?
以下任何一个都可以帮助我:

  • 中组件服务单元的设置
  • 一个设置/代码片段,它使COM对象只允许STA而不允许Both
  • c#中调用方的一个设置/代码片段,它告诉COM+应该用STA初始化COM对象

更新:我试图手动更改注册表中的ThreadingModel条目从BothApartment。这也没有帮助,因为当我尝试实例化COM对象时,我得到一个COMException (0x80110802),事件查看器说:

注册表中指定的组件的线程模型与注册数据库不一致。故障组件为:< MyComponent >

还有其他地方我需要改变线程模型吗?例如在"注册数据库"中?我在哪里可以找到它?

谢谢!

指定实例化进程外COM对象时使用的公寓状态

好的,我在类中插入了以下代码,它是作为COM对象公开的,它似乎工作:

[ComRegisterFunction]
private static void Register(Type registerType)
{
    if (registerType != null)
    {
        using (RegistryKey clsidKey = Registry.ClassesRoot.OpenSubKey("CLSID"))
        {
            using (RegistryKey guidKey = clsidKey.OpenSubKey(registerType.GUID.ToString("B"), true))
            {
                using (RegistryKey inproc = guidKey.OpenSubKey("InprocServer32", true))
                {
                    inproc.SetValue("ThreadingModel", "Apartment", RegistryValueKind.String);
                }
            }
        }
    }
}

我完全不理解,为什么手工更改ThreadingModel不会产生相同的结果,但我不在乎…