2009-09-24 2 views
3

У моего .net-кода есть объект с рядом общих свойств. Этот объект возвращается в код VBA. Все не общие свойства работают хорошо, но мне также необходимо получить доступ к общим значениям. Есть ли способ сделать это с VBA?Доступ к общим объектам .NET из VBA

[ClassInterface(ClassInterfaceType.AutoDual)] 
public class Obj 
{ 
    public string GetProp1() {...} 
    public IList<MyCustomType> GetProp2() {...} 
} 

код VB:

Sub Test() 
    Dim o As Program.Obj 
    Set o = New Program.Obj 
    Set p2 = hp.GetProp2() 

    set p2_0 = p2(0) ' doesn't work 

End Sub 

ответ

0

Я нашел this article, описывая уродливое взломать - называя все через отражение. Поскольку общее значение все еще возвращается как объект, отражение должно работать, но будет 1) медленным, 2) подверженным ошибкам и 3) очень неудобным для вызова.

В статье показано, я хотел бы использовать вспомогательные методы со следующими подписями:

public object GetProperty(object Instance, string Property) 
public object InvokeMethod(object Instance, string Method) 
public object InvokeMethod_OneParm(object Instance, string Method, object Parm1) 
public object InvokeMethod_TwoParms(object Instance, string Method, object Parm1, object Parm2) 
public void SetProperty(object Instance, string Property, object Value) 

Уродливый, но выполнимый.

+0

Предупреждение предлагает исправить это, например, в ответе @Matt Davis – Dude0001

4

Вы не можете сделать это непосредственно (если VS делает ваш COM регистрации, вы должны увидеть предупреждение, как: тип библиотеки экспортер обработки предупредительного «NS.Obj. get_GetProp2 (# 1), Assy '. Предупреждение: экспортер библиотеки типов столкнулся с экземпляром универсального типа в сигнатуре. Общий код не может быть экспортирован в COM.

Что вам нужно сделать, это сделать небольшую не общую обертка и интерфейс для вывода на COM (при условии, что вы хотите строго типизированные объекты). Пока вы ссылки на TypeLib в VBA и получить доступ к объектам через строго типизированные VBA реф, вы можете сделать что-то вроде:

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
public class Class1 
{ 
    public IMyListOfString Strings {get; set;} 
    public Class1() 
    { 
     Strings = new MyListOfString() { "Foo", "Bar", "Baz" }; 
    } 
} 

[ComDefaultInterface(typeof(IMyListOfString))] 
public class MyListOfString : List<string>, IMyListOfString { } 

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IMyListOfString 
{ 
    [DispId(0)] 
    string this[int idx] { get; set; } 
} 

Там трюк, чтобы получить эту работу без ссылки на управляемый TypeLib в VBA (например, latebound), тоже, но я слишком долго не был в мире взаимодействия COM, чтобы помнить, что это такое.

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