Это не работает так в VBA. DLL должна быть COM DLL и быть загружена ссылкой на проект VBA. Это также означает, что DLL должна быть зарегистрирована в реестре Windows. Так что уберите свой C # и запустите VB.NET. Создайте проект DLL и выберите COM-CLASS из шаблонов.
Посмотрите на первую строку здесь (
<Assembly: CommandClass(GetType(ComClass3))> '<<<<add this !!!!
<ComClass(ComClass3.ClassId, ComClass3.InterfaceId, ComClass3.EventsId)>
Public Class ComClass3
#Region "COM-GUIDs"
Public Const ClassId As String = "94b64220-ce6e-400d-bcc0-d45ba56a14f7"
Public Const InterfaceId As String = "89a8c04e-e1fb-4950-85b2-7c1475156701"
Public Const EventsId As String = "af56d401-6492-4172-bf1e-10fa5e419aa4"
#End Region
Public Sub New()
MyBase.New()
End Sub
sub test
'your code
end sub
End Class
Самое интересное, что по совету сборки все ваши сабвуферы и функции отображаются вVBA без каких-либо других действий.
ЧТОБЫ ПОЛУЧИТЬ ЭТУ РАБОТУ НАЧАТЬ ПРОТИВ В РЕЖИМЕ АДМИНИСТРАТОРА !!! В противном случае у него нет необходимых прав для автоматического выполнения регистрации dll.
Если вы счастливы использоватьнекоторый инструмент для преобразования кода в c #. Также возможно просто сделать интерфейс как обертку в VB.net :) Теперь вы можете ссылаться на dll в VBA и делать все с ней, как вы можете делать с другими dll, которые работаютв VBA. Как:
SUB tester
dim x= new comclass3
x.test
end sub
Некоторые подводные камни, которые я забыл упомянуть. VBA и .NET не говорят все время на одном и том же языке строк. Тупо один путь конвертируется автоматически - обратного пути нет. Один говорит, например, в UTF8, а другой - в BSTR. Поэтому, если ничего не возвращается или мусор возвращается, скорее всего, вы выбрали не тот преобразователь строк. Я использую конвертер автоматического определения из .net, если это необходимо. Вы можете сойти с ума от этого. Также не смешивайте 32-битный и 64-битный код или указатели. AutoCAD, например, немедленно обстреляет из этого. (Какой бы гениальный рисунок вы не имели внутри - это не волнует).