我正在制作一个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接口的多个实例?
(我希望我已经解释了问题的清晰度)
感谢任何帮助。
注意:我不是电脑工程师。
答案 0 :(得分:0)
您是否尝试过通过构造函数实际创建多个实例? COM服务器可能只设置为生成一个实例(显式代码或通过DCOM配置,在这种情况下,您可能别无选择,只能使用DLL Load解决方案..
OpenDSS_Instance odss1 = new OpenDSS_Instance( "original" );
OpenDSS_Instance odss2 = new OpenDSS_Instance( "Extra Crispy" );