使用COM互操作将对象从C#传递到VBA

4

能否通过COM从C#传递自定义对象(如MyClass [])到VBA?

如果不行,哪种方法是使其正常工作的最佳解决方案?


1
搜索结果显示 https://dev59.com/y3RC5IYBdhLWcg3wOOL1,可能会引起兴趣。 - Fionnuala
1
只要您将其设置为ComVisible,是的。 - Hans Passant
1个回答

8
我假设您谈论的是Excel VBA到C#的转换。以下是一个最简C#类,可以在默认名称为ClassLibrary1的项目中使用:

using System;
using System.Runtime.InteropServices;

namespace Tester
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class TestClass
    {
        public double D { get; set; }  // simple property to get, set a double
        public string S { get; set; }  // simple property to get, set a string
    }
}

以下是使用VBA测试该类的代码:

Private Sub foo()

Dim X As New ClassLibrary1.TestClass

X.S = "Hello"
Debug.Print X.S ' prints "hello"

X.D = 12
Debug.Print X.D ' prints a 12

End Sub

以下是使其正常工作所需的额外步骤:

(1) in C# Project...Properties...Build ==> check "Register for COM interop
(2) in C# Project...Properties...Application...Assembly Information ==> 
    check "Make assembly COM-visible"
(3) in VBA ... Tools ... References, browse to the C# bin output directory and select the "*.tlb" file

注意:这个方案可能会失败,具体取决于你向类中添加了什么内容 - 我不认为VBA会“看到”静态类或者除默认构造函数以外的其他类。你也不能将VB集合映射到.NET集合,但是你可以来回传递基本类型(double、long)和基本类型的数组。此外,“Autodual”选项是一种廉价的方法来暴露方法...易于入门,但效率较低并且会暴露所有公共方法。更好的做法(但工作量更大)是设置自己的接口。如果你扩展这个TestClass的成员,包括你定义的其他类的实例,并通过AutoDual或手动编码的接口公开这些类方法,那么这些类及其(非重载的)方法也将在VBA中可见(带有智能感知)。
希望这能帮到你。

我在C#3.5,Visual Studio 2008的类库项目中尝试了那个示例。我的构建只创建了一个dll,没有tlb。有什么建议吗? - BuZz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接