2010-07-27 4 views
7

У меня есть библиотека классов, написанная в .Net, которую я хотел бы сделать доступной для VB6/VBA. То, что я пробовал, не сработало (очевидно, поскольку я задаю этот вопрос). Вот что я сделал:Создание DLL COM доступно

  1. Я создал проект библиотеки классов в Visual Studio 2010 Express и поместил код в модуль класса.
  2. Я открыл свойства проекта и перешел к «Сведения о сборке» и установил флажок «Сделать COM видимым».
  3. Я пошел в опции «Advanced Compile» и нацелил .Net 2.0 (это очень простой код).
  4. Затем я удалил все ссылки для «Системы».
  5. Я построил проект (без предупреждений или ошибок) и скопировали DLL из папки Bin в C: \ Windows \ System32 \
  6. Я побежал regsvr32 зарегистрировать DLL и получил ошибку:

The module "MyDll.dll" was loaded but the entry-point DLLRegisterServer was not found.

Make sure that "MyDll.dll is a valid DLL or OCX file and then try again.

Очевидно, что моя первая попытка была немного наивна. Может ли кто-нибудь предложить руководство?

+2

regsvr32 не может быть использован для сборки .NET. Используйте 'regasm' и необязательные аргументы - http://msdn.microsoft.com/en-us/library/tzat5yw6%28VS.71%29.aspx –

ответ

10

Шаг № 6 является неправильным. Сборки .NET с типами [ComVisible] регистрируются в Regasm.exe. Используйте параметр командной строки/codebase, если вы не хотите устанавливать DLL в GAC. Параметр командной строки/tlb создает библиотеку типов, вы можете использовать ее в своем проекте VB6.

+0

Я сделал поиск файла для regasm.exe, и кажется, что его нет. Доступно ли это только с полной версией Visual Studio? Предлагает ли MS загрузку (я все еще работаю в Google, но я думал, что вы можете просто знать.) – Oorang

+2

Он должен быть в каталоге c: \ windows \ microsoft.net \ framework \ v4.0.30319. Для этого вам не хватает «Командная строка Visual Studio». Но это может быть сделано. –

+0

OK Я нашел RegAsm и использовал его. Это создало tlb, на который я мог ссылаться. Когда я открыл его в VB6/VBA, все свойства и методы отсутствовали. Прочитав некоторые из других ссылок, я полагаю, что мне нужно создать интерфейс (что-то я не делал, просто создал класс). Я все еще настраиваю интерфейс, но это был важный шаг. Спасибо. – Oorang

0

Я абсолютно уверен, что RegSvr32 работает только с не-.NET DLL. Сборки .NET хранятся в глобальном кэше сборок (GAC). Вам нужно запустить gacutil.exe.

+0

Ввод их в GAC не требуется. regasm с ключом '/ codebase' будет отлично. – sharptooth

+0

@sharptooth: Спасибо, я не знал, что – 2010-07-28 14:00:39

3

Вам нужно будет определить GUID для ваших интерфейсов и отметить, какие классы реализуют интерфейсы, чтобы начать. MSDN имеет getting started guide. Вам не нужно запускать regsvr32, но вы должны поместить DLL где where the app can find it:

After registering an assembly using Regasm.exe, you can install it in the global assembly cache so that it can be activated from any COM client. If the assembly is only going to be activated by a single application, you can place it in that application's directory.

Существует также хороший обзор всего процесса here.

+0

+1 Для ссылок. – Oorang

0

Используйте GacUtil вместо RegSvr32. RegSvr используется для dll, сделанных с помощью VB6, и для .NET DLL вам нужно использовать GacUtil, потому что он добавляется в глобальный кеш сборки.