gpt4 book ai didi

c# - 从 VBA 访问 .NET 通用对象

转载 作者:行者123 更新时间:2023-11-30 15:49:31 25 4
gpt4 key购买 nike

我的 .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

最佳答案

你不能直接这样做(如果 VS 正在做你的 COM 注册,你应该看到类似这样的警告:Type library exporter warning processing 'NS.Obj.get_GetProp2(#1), Assy'。警告:Type library exporter在签名中遇到泛型类型实例。泛型代码可能无法导出到 COM。

您需要做的是制作一个小的非通用包装器和一个接口(interface)以向 COM 公开(假设您需要强类型对象)。只要您在 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; }
}

在不引用 VBA 中的托管类型库(例如,latebound)的情况下也有一个技巧可以让它工作,但我已经离开 COM 互操作世界太久了,以至于记不起它是什么了。

关于c# - 从 VBA 访问 .NET 通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1474100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com