提出COM应用程序的几个实例

时间:2014-02-03 10:19:35

标签: c# com copy

我正在制作一个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接口的多个实例?

(我希望我已经解释了问题的清晰度)

感谢任何帮助。

注意:我不是电脑工程师。

1 个答案:

答案 0 :(得分:0)

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

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