【问题标题】:VBA object browser doesn't show class members in my .NET dll libraryVBA 对象浏览器不显示我的 .NET dll 库中的类成员
【发布时间】:2016-02-09 10:53:30
【问题描述】:

我正在尝试制作一个可从 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 编辑器中的 Tools --> References 访问它,并且以下 VBA 代码按预期工作:

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

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

【问题讨论】:

    标签: c# .net vba excel


    【解决方案1】:

    嗯,你对你所做的事情的描述缺少几个步骤,在我看来。您需要 GUID。你需要一个接口,你的类需要实现它。您需要指定该类应如何与接口一起使用。需要将其设置为“无”类型,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
    

    【讨论】:

    • 有效!如果没有指定,似乎 guid、ClassInterface 和 ComVisible 属性是由 VS.NET 在后台设置的,但是您的解决方案(这可能是标准的做事方式)允许更细粒度的控制。具体来说,需要接口指定哪些成员通过对象浏览器暴露给客户端。
    【解决方案2】:

    在 VS 中,你需要将 XML cmets 添加到你的代码中:

    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 功能所需的元数据。

    【讨论】:

    • 感谢您的建议,但不幸的是,它不起作用。 VBA 端没有变化。
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2020-05-10
    相关资源
    最近更新 更多