【发布时间】: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 接口之一。如果是“应用程序”自动化接口,赔率很低,为零。你必须是一名“计算机工程师”才能尝试一下。请先向供应商寻求支持。
-
您认为有可能在解决方案中使用多个引用项目的实例吗?