代码之家  ›  专栏  ›  技术社区  ›  JMarsch

将类公开为sta-com

  •  4
  • JMarsch  · 技术社区  · 14 年前

    我有一个C类需要作为COM公开。将使用COM对象的工具要求我支持STA。对于我的COM对象,有什么特别需要做的吗?

    (我知道sta thread属性,但(除非我错了)它是用来指示.NET中的执行线程是sta兼容的,而不是用来指示我的COM对象需要兼容)。

    这是我的声明。你看到我需要补充什么吗?

    
        [ComVisible(true)]
        [ClassInterface(ClassInterfaceType.None)]
        [ComDefaultInterface(typeof(ITestClass1))]
        [Guid("093A3701-2C53-4A31-97C5-0F3C205E5B4C")]
        public class Class1: ITestClass1 {..}
    
        [ComVisible(true)]
        [Guid("8D52F785-CDD8-4248-8AB7-97B8C19DE59B")]
        public interface ITestClass1 {..}
    
    
    2 回复  |  直到 11 年前
        1
  •  7
  •   Hans Passant    11 年前

    COM服务器用名为threading model的注册表项通告它所需的线程模型。如果注册表项丢失或设置为“公寓”,则默认为单线程。

    regasm.exe将此密钥设置为“both”。这意味着您的服务器声明与STA线程和MTA线程都兼容。在某种程度上与.NET代码保持一致,它支持线程,但需要注意线程安全。更改这个非常困难,您必须编写自己的注册过程,并用[ComRegisterFunction]属性对其进行注释。

    简单的方法是将密钥设置为“both”,并检查类构造函数中的单元状态。使用thread.getCurrentThread().getApartmentState()。如果您得到了MTA,那么抛出一个异常来告诉客户机您不支持多线程。许多.NET类都这样做。

        2
  •  2
  •   Community Reversed Engineer    7 年前

    this answer 例如,执行必要注册表voodoo的comregisterFunction。在某些情况下,您可能需要这样做——例如,当您希望确保线程是STA时,这样您就可以与只需要由STA线程使用的其他COM对象进行交互。