为什么我的COM类不是Singleton ?

本文关键字:Singleton 我的 COM 为什么 | 更新日期: 2023-09-27 18:09:29

由于某些原因,在应该是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可以正常工作,但该类的用户必须尊重这一事实,即它是一个单例,只能使用instance属性访问它。

[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,并再次调用构造函数。这很麻烦,因为桥是一个通信组件,我需要这两个应用程序使用桥相互交谈。

提示吗?

为什么我的COM类不是Singleton ?

假设com对象被配置为Out of Process com对象(我假设这是因为它看起来像它曾经以VB的方式工作),那么你必须跳过一些障碍才能使它作为Out of Process对象激活。默认情况下,. net将该对象作为一个In Process com对象加载,这意味着每个进程都将拥有该对象的副本。根据这里的文章

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