指定实例化proc COM对象时要使用的单元状态

时间:2011-04-20 07:00:31

标签: c# .net com com+

我在.NET中创建了一个COM对象,并使用regsvcs将其注册为使用Pooling = 1的COM +服务器应用程序。我目前正在寻找一个bug,因此需要确保这个COM对象在STA中运行,而不是在MTA中运行。我怎么指定这个?
以下任何一项都会对我有所帮助:

  • 中的“组件服务”对话框中的设置
  • 设置/代码片段,它使COM对象仅允许STA而不是两者
  • 调用者端的C#中的设置/代码片段告诉COM +应该用STA初始化COM对象

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

  

注册表中指定的组件的线程模型与注册数据库不一致。有缺陷的组件是:< MyComponent >

我需要更改线程模型吗?例如在“注册数据库”中?我在哪里可以找到它?

谢谢!

1 个答案:

答案 0 :(得分:3)

好的,我将以下代码插入到作为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并没有产生相同的结果,但我不在乎......