gpt4 book ai didi

c# - 使用 com-interop 将数组从 vba 传递到 c#

转载 作者:太空狗 更新时间:2023-10-29 21:47:54 25 4
gpt4 key购买 nike

使用 com-interop 将一组用户定义的类从 vba 传递到 .net(特别是 c#)的正确方法是什么?

这是我的 C# 代码。如果我从 vba 调用 Method1,它会失败并显示“预期的数组或用户定义类型”或“函数使用 visual basic 不支持的自动化类型”。

public class MyClass 
{
public Method1(UserDefinedClass[] Parameters) { ... }
public Method2(Object Parameters) { ... }
}

我已经阅读了一些关于 MarshallAsAttribute 类的内容。这可能是 c# 代码中缺失的部分吗?

这是我正在使用的 vba 代码:

Dim udt As New UserDefinedClass
Dim myArray()
myArray(1) = udt
myClass.Method1(myArray)
myClass.Method2(myArray)

最佳答案

IIRC 你必须通过引用传递数组。

尝试将你的方法声明为

public class MyClass  
{
public void Method1([In] ref UserDefinedClass[] Parameters) { ... }
...
}

如果您不想用 .NET 客户端的 ref 参数污染您的类,您可以定义一个 ComVisible 接口(interface)供 COM 客户端使用,并显式实现它:

[ComVisible(true)]
public interface IMyClass
{
void Method1([In] ref UserDefinedClass[] Parameters) { ... }
...
}

public class MyClass : IMyClass
{
void IMyClass.Method1(ref UserDefinedClass[] Parameters)
{
this.Method1(Parameters);
}

public Method1(UserDefinedClass[] Parameters)
{
...
}
}

** 回应评论**如果你想向 VBA 公开一个集合而不是一个数组,你只需要公开一个枚举器,以及你希望 VBA 代码能够调用的任何其他方法(例如添加、删除、插入、清除等) .例如。

[ComVisible]
public interface IUserDefinedClassCollection
{
IEnumerator GetEnumerator();

int Count { get; };

IUserDefinedClass this[int index] { get; }

int Add(IUserDefinedClass item);

// etc, other methods like Remove, Clear, ...
}

然后您可以像往常一样在 VBA 中使用它:

Dim objUserDefinedClasses As UserDefinedClassCollection
...
objUserDefinedClasses.Add objUserDefinedClass
...
For nIndex = 0 To objUserDefinedClasses.Count

Next nIndex

关于c# - 使用 com-interop 将数组从 vba 传递到 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2027758/

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