Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用com互操作将数组从vba传递到c#_C#_Vba_Com Interop - Fatal编程技术网

使用com互操作将数组从vba传递到c#

使用com互操作将数组从vba传递到c#,c#,vba,com-interop,C#,Vba,Com Interop,使用com互操作将用户定义的类数组从vba传递到.net(特别是c#)的正确方法是什么 这是我的密码。如果我从vba调用Method1,则会出现“预期为数组或用户定义类型”或“函数使用visual basic不支持的自动化类型”的故障 我已经读了一些关于MarshallLasAttribute类的内容。这可能是c代码中缺失的部分吗 以下是我使用的vba代码: Dim udt As New UserDefinedClass Dim myArray() myArray(1) = udt myClas

使用com互操作将用户定义的类数组从vba传递到.net(特别是c#)的正确方法是什么

这是我的密码。如果我从vba调用Method1,则会出现“预期为数组或用户定义类型”或“函数使用visual basic不支持的自动化类型”的故障

我已经读了一些关于MarshallLasAttribute类的内容。这可能是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参数污染类,可以定义COM客户端使用的ComVisible接口,并显式实现它:

[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代码能够调用的任何其他方法(例如添加、删除、插入、清除等)。例如

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

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

Next nIndex

我们需要更多的信息。你能添加类型的VBA定义和一些显示你调用COM接口的代码吗?你的数组声明是声明一个变量数组-它应该声明你的UserDefinedClass的数组,例如我应该提到的“Dim myArray(0到3)As UserDefinedClass”。我也尝试过,结果是“函数使用了vb不支持的自动化类型”。我真的认为问题在于c#中方法的定义,但问题完全可能出在vba代码中。我对VB完全陌生。我已经尝试过了,但是我没有明确尝试添加'in'子句。我也要试一试。恐怕使用'ref UserDefinedClass[]foo'会导致相同的错误。因此,您是说我不需要在'Parameters'参数中包含任何附加属性。我在这里看到了其他使用MarshallAs的代码,但正如我所提到的,在我的场景中似乎不起作用。“那么,你是说…”-我知道你需要ref来表示基元类型的数组参数。[In]属性会影响IDL的生成,因此不是必需的。我通常会使用集合类型将用户定义的类传递给VBA(公共类MyUserDefinedClassCollection:collection),因此我实际上没有尝试过这种方法。集合类也可以。要将集合传递给c#,vba代码是什么样子的?您不需要将其作为引用传递。例如,“void Method1(MyUserDefinedClassCollection);”。当然,集合类和MyUserDefinedClass都需要是可见的。
[ComVisible]
public interface IUserDefinedClassCollection
{
    IEnumerator GetEnumerator();

    int Count { get; };

    IUserDefinedClass this[int index] { get; }

    int Add(IUserDefinedClass item);

    // etc, other methods like Remove, Clear, ...
}
Dim objUserDefinedClasses As UserDefinedClassCollection
...
objUserDefinedClasses.Add objUserDefinedClass 
...
For nIndex = 0 To objUserDefinedClasses.Count

Next nIndex