为什么我的COM类不是Singleton?

时间:2014-06-19 16:09:51

标签: c# com ipc unmanaged

出于某种原因,当它们应该是Singleton时,正在创建2个对象。

我有一个类Bridge,其目的是从一个应用程序到另一个应用程序进行通信。第一个应用程序App1通过COM创建桥接器并立即调用桥接器的初始化方法:

bool IBridge.Initialize(ref App1 theApp)
{
       if (theApp != null)
       {
            this.refToApp = theApp;
            log("Got bridge from App1");
            //spin up App2
            Process.Start([path to App2]);
       }
       else
       {
           log("theApp was null");
       }
       return true;
}

Bridge类使用单例模式,但有一个公共默认构造函数,以便COM可以正常使用它,但是这个类的用户必须通过仅使用实例属性访问它来尊重它是单例的事实。

[ComVisibleAttribute(true)]
[ProgId("[id that App1 uses to instantiate class]")]
public class Bridge : IBridge
{
    private static readonly _instance;

    public static COMBridge Instance
    {
        get
        {
            if(_instance == null){
                _instance = new Bridge();
            }
            return _instance
        }
    }

  public Bridge()
  {
       log("Called default constructor");
       if (_instance == null)
       {
            _instance = this;
       }
  }

 ...

然而,当App2启动时,它会调用Instance的getter并再次调用构造函数。这很麻烦,因为Bridge是一个通信组件,我需要这两个应用程序使用桥接器相互通信。

任何提示?

1 个答案:

答案 0 :(得分:2)

假设com对象被配置为Out of Process com对象(我假设这是因为它看起来像是从VB那样工作)然后你必须跳过一些箍来让它激活为一个进程外对象。默认情况下.Net会将对象作为In Process com对象加载,这意味着每个进程都有自己的对象副本。按照艺术here

  

如果您现在尝试使用COM对象,您可能会发现它仍然加载到客户端的进程中。原因是你必须告诉COM你对进程外激活感兴趣。如果您使用的是C / C ++,请将CLSCTX_LOCAL_SERVER作为CoCreateInstance函数的dwClsContext参数传递。如果您正在使用C#/ VB.NET,则必须为此进行P / Invoke到CoCreateInstance。