2014-02-03 5 views
0

Я делаю приложение C#, которое использует сетевой решетку OpenDSS через свой COM-интерфейс.Поднять несколько экземпляров COM-приложения

Возможно запустить несколько автономных экземпляров 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

Вы не можете глубоко-клонировать ссылку на COM-интерфейс, если он вообще поддерживается COM-сервером, тогда он будет выставлять один из интерфейсов IPersist. Коэффициенты низки, ноль, если это интерфейс автоматизации «Application». Вы должны быть «компьютером» инженер », чтобы сделать снимок. Сначала попросите поставщика о поддержке. –

+0

Как вы думаете, можно ли использовать более одного экземпляра проекта, на который делается ссылка, в пределах soution? –

ответ

0

Вы пытались фактически создать несколько экземпляров через конструктор? Возможно, что COM сервер настроен только генерировать один экземпляр (либо явно в коде или через DCOM Config, в этом случае не может быть никакого выбора, кроме как обратиться к вашему решению Load DLL ..

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

К сожалению, это то же самое, как odss1, так и odss2 являются окончательными ссылками на одну и ту же DLL. –

+0

@ user3020849, это ожидаемо для сервера in-proc. Однако они должны быть двумя разными объектами. Почему вы хотите загрузить одну и ту же DLL более одного раза? – acelent

+0

@ user3020849, но являются ли они ссылками на один и тот же _объект_? Если вы измените значение единицы, это отразится на другом? –

Смежные вопросы