【问题标题】:Raise several instances of a COM Application引发 COM 应用程序的多个实例
【发布时间】:2014-02-03 23:26:30
【问题描述】:

我正在制作一个 C# 应用程序,该应用程序通过其 COM 接口使用电网求解器 OpenDSS。

可以运行多个独立的 OpenDSS 实例。

我已经实现了 ICloneable 来尝试获取多个 COM 实例而不是一个没有成功:

/// <summary>
/// Actual OpenDSS instance
/// </summary>
[Serializable]
public class OpenDSS_Instance : ICloneable {

    public string InstanceName { get; set; }
    private DSS DSSobj;
    private Text DSSText;
    private Circuit DSSCircuit;
    private Solution DSSSolution;
    private CtrlQueue DSSControlQueue;

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="instancename"></param>
    public OpenDSS_Instance( string instancename ) {
        InstanceName = instancename;
    }

    /// <summary>
    /// Return a clone of this class
    /// </summary>
    /// <returns></returns>
    public object Clone() {
        return this.MemberwiseClone();
    }

    /// <summary>
    /// Starts OpenDSS
    /// </summary>
    public int Start_ODSS_Instance() {
        DSSobj = new DSS();
        if ( !( DSSobj.Start( 0 ) ) ) {
            App.func.msgboxErr( "DSS [" + InstanceName + "] failed to start.\nDoes the computer has OpenDSS installed?", "OpenDSS" );
            return 1;
        } else {
            App.func.dmessage( "DSS [" + InstanceName + "] started sucessfully" );
            DSSText = DSSobj.Text;
            DSSCircuit = DSSobj.ActiveCircuit;
            DSSSolution = DSSCircuit.Solution;
            DSSControlQueue = DSSCircuit.CtrlQueue;
            return 0;
        }

    }
}

然后我从另一个类创建这个类的副本列表,如下所示:

List<OpenDSS_Instance> OpenDSS = new List<OpenDSS_Instance>();

public int startInstances() {
        //Initialize an OpenDSS instance per logical processor
        int err_num = 0;
        OpenDSS_Instance odss = new OpenDSS_Instance( "original" );

        for ( int i = 0; i < instance_number; i++ ) {
            this.OpenDSS.Add( (OpenDSS_Instance)odss.Clone() );
            this.OpenDSS[i].InstanceName = "ODSS_" + i;
            err_num += this.OpenDSS[i].Start_ODSS_Instance();
        }

        return err_num;
    }

我的问题是实例列表不是副本,而是对同一实例的引用。

不管我做了什么,如何创建一个 COM 接口的多个实例?

(希望我已经把问题解释得够清楚了)

感谢任何帮助。

注意:我不是计算机工程师。

【问题讨论】:

  • 您不能深度克隆 COM 接口引用。如果 COM 服务器完全支持它,那么它将公开 IPersist 接口之一。如果是“应用程序”自动化接口,赔率很低,为零。你必须是一名“计算机工程师”才能尝试一下。请先向供应商寻求支持。
  • 您认为有可能在解决方案中使用多个引用项目的实例吗?

标签: c# com copy


【解决方案1】:

您是否尝试过通过构造函数实际创建多个实例? COM 服务器可能设置为仅生成一个实例(在代码中显式或通过 DCOM 配置,在这种情况下,您可能别无选择,只能求助于您的 DLL 加载解决方案。..

OpenDSS_Instance odss1 = new OpenDSS_Instance( "original" );
OpenDSS_Instance odss2 = new OpenDSS_Instance( "Extra Crispy" );

【讨论】:

  • 很遗憾,都是一样的,odss1和odss2最终都是引用同一个dll。
  • @user3020849,这对于进程内服务器来说是可以预期的。但是,它们应该是两个不同的对象。为什么要多次加载同一个 DLL?
  • @user3020849 但它们是否引用了相同的 object?如果你改变一个值,它会反映在另一个中吗?
  • @accelent,我想多次加载同一个 DLL 以多次访问求解器。这对于使用所有处理器能力很有用,因为单个模拟只使用了我 i7 的 14%
  • 我有以下内容,但我删除了它(不记得为什么)我找到了解决方案:不要复制你的 DLL。制作一个单独的项目 在该单独的项目中,将对引用的 COM 应用程序的所有调用设为静态和公共的。现在从主项目中引用该新项目。现在您可以创建该项目的多个实例,其中包含对您的 COM 应用程序的调用。这样做,COM 应用程序不会被引用而是被实例化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多