使用COM Interop从VBA调用C#方法

问题描述 投票:0回答:1

通过引用this,我能够将Entities.tlb文件附加到VBA。但是我无法从C#中的类创建实例。这是我的代码,

C#类

namespace Entities
{
    [Guid("1558C766-44DA-4DA5-BF2F-CBD6804E7E21")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface ITools
    {
        ABC GetABC();

    }

    [Guid("514719AC-E137-4FCA-82AF-73E4025A8625")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    public class Tools : ITools
    {
        public Tools()
        {

        }

        public methods ...
    }
}

从VBA,

Dim objElement As New Entities.Tools

这引起错误:无效使用新关键字

而且在VBA对象浏览器中,对于附加的Entities.tlb,它还会显示Entities命名空间下的所有类。但这并未在这些类中显示任何方法。

如何在VBA中创建Tools类的实例并从VBA中访问Tools类的方法?

vba com-interop
1个回答
-1
投票

删除构造函数。 VBA无法使用它们,而c#将透明地实现默认构造函数。

然后尝试上课

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ITools))]

并且在界面中

只是

[ComVisible(true)]

然后在VBA中使用

Dim objElement as Tools
set objElement = new Tools

我有一个可以从VBA访问的C#类,这是我发现的唯一一种在VBA中提供智能感知并仍然允许诸如GetEnumerator之类的项目正常工作的方法。

Kvp C# dictionary wrapper for VBA

[您还应该注意,如果您的类中有索引器,则.Item [x]语法仅在您选择不具有智能感知时才起作用。如果您具有智能,则使用.Item [x] = value将由于在为索引器构造中间语言方面存在错误而产生VBA错误。

© www.soinside.com 2019 - 2024. All rights reserved.