2015-04-17 11 views
5

Фоновая информация:
Я строю систему SCADA, которая работает на VBA, и я ищу некоторые из возможностей C#. Я создаю библиотеку DLL на C# и получаю базовые данные для обмена данными между DLL и VBA.VBA массив пользовательских объектов из C# DLL

[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)] 
public class BE_Log 
{ 
    public string DateTime 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string User 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string SCADA 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string Tag 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string Area1 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string Area2 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string Description 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string ValueOld 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 
    public string ValueNew 
    { 
     [return: MarshalAs(UnmanagedType.BStr)] 
     get; 
     [param: MarshalAs(UnmanagedType.BStr)] 
     set; 
    } 

    public BE_Log(string DataTime, string User, string SCADA, string Tag, string Area1, string Area2,string Description) 
    { 
     this.DateTime = DateTime; 
     this.User = User; 
     this.SCADA = SCADA; 
     this.Tag = Tag; 
     this.Area1 = Area1; 
     this.Area2 = Area2; 
     this.Description = Description; 
    } 

    public BE_Log(string DataTime, string User, string SCADA, string Tag, string Area1, string Area2, string Description, string ValueOld, string ValueNew) 
    { 
     this.DateTime = DateTime; 
     this.User = User; 
     this.SCADA = SCADA; 
     this.Tag = Tag; 
     this.Area1 = Area1; 
     this.Area2 = Area2; 
     this.Description = Description; 
     this.ValueOld = ValueOld; 
     this.ValueNew = ValueNew; 
    } 

} 

И я вернулся класс как это:

[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)] 
public class TI 
{ 
    private BLL_LogBook bll; 

    public TI() 
    { 
     bll = new BLL_LogBook(); 
    } 

    [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_USERDEFINED)] // SafeArrayUserDefinedSubType = typeof(BE_Log) 
    public BE_Log[] CreateLogBook() 
    { 
     List<BE_Log> logs = bll.GetLogEntry(); 
     return logs.ToArray(); 
    } 
} 

Мой слой данных:

public class BLL_LogBook 
{ 
    public List<BE_Log> GetLogEntry() 
    { 
     List<BE_Log> logs = new List<BE_Log>(); 
     logs.Add(new BE_Log("05-05-2015", "some user", "scada01", "LA010NDA10CU12XQ12", "Ribe", "Esbjerg", "Some short description")); 
     logs.Add(new BE_Log("06-05-2015", "test user", "scada01", "LA010NDA10CU12XB05", "Herning", "KBH", "Some long description")); 
     logs.Add(new BE_Log("07-05-2015", "normal user", "scada02", "LA010NDA10CU12YQ01", "Åhus", "Tønder", "Some test description")); 

     return logs; 
    } 
} 

Статический метод VBA зовёт:

static class UnmanagedExports 
{ 
    [DllExport] 
    [return: MarshalAs(UnmanagedType.IDispatch)] 
    static Object TI_Object() 
    { 
     return new TI(); 
    } 
} 

В VBA я получил данные таким образом:

Declare Function TI_Object Lib "<path>\\TJI.dll"() As Object 

Sub TestTheTestClass() 
    Dim TJI As Object 
    Set TJI = TI_Object() 

    Dim test As Variant 
    test = TJI.CreateLogBook() 

    Dim log As Variant 
    Set log = test(0) 

    Debug.Print log.User 
End Sub 

Теперь мой вопрос:
Как вернуть массива или Список класса '' BE_Log
EDIT:Это где я застрял: http://puu.sh/hnPGe/472ff863d0.png

Я пытался разработать некоторые из документации Microsoft, без большой удачи.

руководство я оригинал следовал был один:
http://www.analystcave.com/excel-use-c-sharp-in-excel-vba/

Он заявляет следующее, однако я не совсем понимаю.

If you are using an array as an argument be sure to use the C# “ref” get by reference option e.g. ref int[] ar

Я думаю, что это что-то делать с «MarshalAs» или, как я прочитал данные в VBA

ответ

1

If you are using an array as an argument be sure to use the C# “ref” get by reference option e.g. ref int[] ar

Это верно, но у вас нет каких-либо методов, которые принимают аргумент массива , поэтому это не относится к вашей ситуации.

Вы пробовали изменить свой метод подписи:

public Log CreateLogBook() 

для подписи, который возвращает массив:

public Log[] CreateLogBook() 
+0

я попробовать как с массивом и списком 'общественности Log [] CreateLogBook() ' ' public List CreateLogBook() ' –

+0

« Я действительно пытался ... »- и каков был результат? – Joe

+0

Я не могу получить VBA для чтения данных, или, может быть, я не сделал «Маршал» правильно? Можете ли вы представить пример того, как читать массив в VBA, из DLL? –

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

  • Нет связанных вопросов^_^