Вопрос по excel, vb6, dll, interop, c# – Простая C # DLL - как мне ее вызвать из Excel, Access, VBA, VB6?

35

У меня есть простая библиотека классов, написанная на c #.

using System;
namespace TestDll
{
    public class Test
    {
        public string HelloWorld
        {
            get
            {
                return "Hello World";
            }
        }
    }
}

У меня вопрос, как я могу вызвать эту функцию HelloWorld из Microsoft Office Visual Basic (которая, я думаю, VB6)?

Моим первым шагом было добавление библиотеки DLL в качестве ссылки, но при просмотре и выборе скомпилированной библиотеки DLL сообщение «Не могу добавить ссылку на указанный файл». был брошен.

Кто-нибудь может указать мне правильное направление относительно того, почему / как заставить это работать?

Спасибо заранее ТАК!

Вызов функции DLL из EXCEL VBA:social.msdn.microsoft.com/Forums/en-US/… Martin
Обмен тега dllimport для тега взаимодействия ... Ant

Ваш Ответ

4   ответа
9

что в Visual Studio 2008, чтобы получить файл .tlb, вы должны также пойти под Application | Информация о сборке и выберите «Сделать сборку COM видимой». Мне понадобилось время, чтобы найти это, поэтому надеюсь, что это поможет другим.

+1 спасибо, спасибо, спасибо! До этого работал с перебоями, потом остановился, теперь работает после этого, бог знает, что будет дальше, но, по крайней мере, пока это работает. Использование VS2010 здесь, так что все еще актуально.
50

твие. Фактически, ваш код даже не компилируется, метод должен быть в классе. Вот как вы можете это сделать:

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")]  //Allocate your own GUID
public interface _Test
{
    string HelloWorld { get; }
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("E2F07CD4-CE73-4102-B35D-119362624C47")]  //Allocate your own GUID
[ProgId("TestDll.Test")]
public class Test : _Test
{
    public string HelloWorld { get { return "Hello, World! "; } }
}

В свойствах проекта на вкладке «Сборка» выберите «Регистрация для COM-взаимодействия». Таким образом, вы можете увидеть результаты быстро. Чтобы установить dll на другую машину, вам нужно использовать regasm.

Затем потреблять это:

Dim o : Set o = CreateObject("TestDll.Test")
MsgBox o.HelloWorld

Вы также можете ссылаться на DLL и использовать раннее связывание:

Dim o As TestDll.Test
Set o = New TestDll.Text
MsgBox o.HelloWorld
спасибо AnthonyWJones, действительно хороший ответ - я искал с момента публикации этого ответа - узнал все, кроме того, что я должен был объявить интерфейс! Спасибо!! divinci
Это может быть сделано без объявления интерфейса, но я бы не рекомендовал его, так как использование интерфейса, специально предназначенного для COM-клиента, является гораздо лучшим способом сделать это.
Спасибо, Энтони, ты не против критиковать ответ, который я написал? divinci
Если вы получаете «компонент ActiveX, вы не можете создать объект»; (Ошибка времени выполнения 429) при попытке создать экземпляр вашего класса в VBA вам, вероятно, потребуется запуститьregasm.exe /codebase TestDll.dllдаже на собственной машине.
1

вам также необходимо зарегистрировать свою DLL, используяRegasm.exe который добавляет необходимые записи реестра.

Извините, не заметили, что Энтони Джонс уже упомянул Regasm.
21

После того, как вы скомпилируете и соберете приведенный выше код на своем компьютере разработчика, если

The project properties Build tab, select Register for COM interop.

Ваша выходная папка Visual Studio (обычно bin \ Debug), в которой находится скомпилированный файл * .dll, также будет иметь файл * .tlb.

Этот файл * .tlb является «библиотекой типов». И это необходимо клиентскому компьютеру, чтобы понимать различные «типы». в вашей * .dll и в основном сказать клиентской машине, как его использовать.

Установив вышеуказанный «регистр для COM-взаимодействия»; - Так же как и создаваемый файл * .tlb, сборка (dll) регистрируется на вашем компьютере и поэтому доступна.

В VBA теперь вы можете добавить этот файл в качестве ссылки

VBA Editor -> Tools -> References -> Browse -> Select

это позволит вам затем объявить классы, найденные в вашей библиотеке.

Dim TestClass As Test
Set TestClass = New Test
MsgBox TestClass.HelloWorld

ОДНАКО - если вы хотите затем использовать dll на другом клиентском компьютере, вам нужно будет использовать regasm.exe - для регистрации сборки (dll) на этом компьютере.

Это можно сделать из командной строки,

regasm.exe

в этом случае

regasm.exe TestDll.dll

как только вы зарегистрируете сборку на новом клиентском компьютере, вы сможете получить к ней доступ, снова добавив ссылку на ее * .tlb

Надеюсь это поможет!

Алексею .Net DLL потребуется .NET Framework для запуска на клиентском компьютере. divinci
Да, я думаю, вы хорошо это поняли
Вы запускаете regasm на компьютере разработчика или клиентском компьютере? Потому что на моей клиентской машине не установлен .NET.

Похожие вопросы