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

时间:2016-02-09 10:53:30

标签: c# .net vba excel-vba excel

我试图创建一个可从VBA(MS Office)访问的简单(无依赖项).NET dll文件。我使用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

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

2 个答案:

答案 0 :(得分:3)

在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文件与程序集具有相同的名称。这应该提供填充IntelliSense功能所需的元数据。

答案 1 :(得分:1)

嗯,你对你所做的事情的描述缺少了一些步骤,在我看来。你需要GUID。您需要一个您的类需要实现的接口。您需要指定类应如何与Interface一起使用。它需要设置为“无”类型,以便Intellisense等工作。

这是我的.NET COM DLL的一个摘录,它出现在对象浏览器中,并在为VBA项目引用时提供Intellisense。

[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