VBA 对象浏览器在我的 .NET dll 库中不显示类成员

本文关键字:显示 成员 dll 浏览器 对象 我的 NET VBA | 更新日期: 2023-09-27 18:33:45

我正在尝试制作一个简单的(无依赖关系).NET dll文件,可以从VBA(MS Office)访问。我正在使用VS2015 Express,并使我的dll成为最简单的方法:创建一个类库,添加一个简单的类,并选中选项"使程序集COM可见"以及"注册COM互操作"。

我的 C# 代码:

namespace TestLib {
    public class Hello {
        public int timestwo(int i) {
            return 2 * i;
        }
    }
}

该库会在生成时自动添加到 Windows 注册表中。我可以从MS Office VBA编辑器中的工具-->参考中访问它,并且以下VBA代码按预期工作:

Sub test()
  Dim h as TestLib.Hello
  MsgBox h.timestwo(2)
End Sub

现在有趣的是:对象浏览器显示我的类,但没有成员函数!因此,自动完成功能不起作用...这是怎么回事?

VBA 对象浏览器在我的 .NET dll 库中不显示类成员

嗯,在我看来,您对所做的事情的描述缺少几个步骤。您需要 GUID。你需要一个接口,你的类需要实现它。并且您需要指定类应如何使用接口。需要将其设置为类型"无",智能感知等才能正常工作。

这是我的 .NET COM DLL 的摘录,它确实出现在对象浏览器中,并在引用 VBA 项目时提供智能感知。

[Guid("149F7A5F-7DAC-4426-8AA0-28975A2CE203")]
[ComVisible(true)]
public interface ITest
{
    string testLT(string FilePath, object Args);
    string RemoveListTemplates(string FilePath, object Args);
    void test(string arg);
}
[Guid("D86307C2-3FFA-4518-BABC-DA5F26ABC445")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Test : ITest

在 VS 中,您需要在代码中添加 XML 注释:

namespace TestLib {
    public class Hello {
        /// <summary>
        /// A method to return value * 2
        /// </summary>
        /// <param name="i">An integer to multiply by two</param>
        public int timestwo(int i) {
            return 2 * i;
        }
    }
}

然后,确保选中XML Documentation File的复选框,并确保 XML 文件与程序集同名。这应提供填充智能感知功能所需的元数据。