Вызов метода C# из VBA с использованием COM Interop - PullRequest
0 голосов
/ 16 апреля 2020

С помощью ссылки на я смог прикрепить файл 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. Но в этих классах не отображается никакой метод.

Как создать экземпляр класса Tools в VBA и получить доступ к методам в классе Tools из VBA?

1 Ответ

0 голосов
/ 16 апреля 2020

Удалить конструктор. VBA не может их использовать, и c# будет прозрачно реализовывать конструктор по умолчанию.

Затем попробуйте в классе

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

и в интерфейсе

Просто

[ComVisible(true)]

Затем в VBA

Dim objElement as Tools
set objElement = new Tools

у меня есть класс C#, к которому я обращаюсь из VBA, и это единственный найденный мной способ, который дает intellisense в VBA и по-прежнему позволяет такие элементы, как GetEnumerator для правильной работы.

Kvp C# оболочка словаря для VBA

Вы также должны знать, что если в вашем классе есть индексатор, то синтаксис .Item [x] будет только работать, если вы решили не иметь intellisense. Если у вас есть intellisense, то использование .Item [x] = value приведет к ошибке VBA из-за ошибки в создании промежуточного языка для индексатора.

...