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

Posted

技术标签:

【中文标题】使用 COM 互操作将对象从 C# 传递到 VBA【英文标题】:Passing objects from C# to VBA using COM Interop 【发布时间】:2011-06-28 17:02:05 【问题描述】:

是否可以使用 COM 将自定义对象(如 MyClass[])从 C# 传递到 VBA?

如果不是,哪个是最好的解决方案?

【问题讨论】:

搜索到了***.com/questions/375457/…,这可能很有趣。 只要你把它设为 ComVisible,就可以。 【参考方案1】:

我假设您正在谈论 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 中(使用 Intellisense)。

希望这会有所帮助。

【讨论】:

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

以上是关于使用 COM 互操作将对象从 C# 传递到 VBA的主要内容,如果未能解决你的问题,请参考以下文章

以互操作方式传递对象 - JavaBean 到 C#

以互操作方式传递对象 - JavaBean 到 C#

将 C# 函数指针传递到 C++/CLI 互操作 dll

将数组从 VBA 传递到 VB.NET

无法将字符串从VBA(Excel)传递到我的COM对象

如何将 COM 对象的 C# 引用传递给 C++ DLL