代码之家  ›  专栏  ›  技术社区  ›  Yuri Astrakhan

从VBA访问.NET通用对象

  •  3
  • Yuri Astrakhan  · 技术社区  · 15 年前

    我的.NET代码有一个具有许多通用属性的对象。此对象将返回到VBA代码。所有非泛型属性都工作正常,但我还需要访问泛型值。有没有一种方法可以从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
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   nitzmahone    15 年前

    您不能直接这样做(如果vs正在进行COM注册,您应该看到一个警告,如:类型库导出程序警告处理“ns.obj.get揤getprop2(1),assey”。警告:类型库导出程序在签名中遇到泛型类型实例。不能将通用代码导出到COM。

    您需要做的是做一个小的非通用包装器和一个向COM公开的接口(假设您需要强类型对象)。只要引用vba中的typelib并通过强类型的vba refs访问对象,就可以执行以下操作:

    [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; }
    }
    

    有一个技巧可以让它在不引用vba中托管的typelib的情况下工作(例如,后期绑定),但我已经离开了COM interop世界太久了,记不清它是什么。

        2
  •  0
  •   Yuri Astrakhan    15 年前

    我发现 this article 描述一个丑陋的黑客-通过反射呼叫一切。由于泛型值仍然作为一个对象返回,所以反射应该可以工作,但会很慢,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)
    

    丑陋,但可行。