为什么我的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对象被配置为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。