2016-04-06 4 views
0

Я построил DLL .net COM dll (debug x64) на одной машине. У меня есть все настройки и работы там (я вижу это на C: \ Windows \ Micorosft.NET \ assembly и OLEVIEWER).COM .NET DLL не регистрируется в GAC (REGDB_E_CLASSNOTREG)

Я взял dll на другую машину (вместе с файлом .h и .c, сгенерированным из MIDL). Я регистрирую dll в GAC, выполнив следующие шаги: http://codeingaddiction.blogspot.com/2011/06/how-to-add-strong-name-to-existing-dll_16.html - создать пару ключей, сгенерировать MISL, перестроить сборку из MISL с помощью ключа, а затем добавить его в GAC. Кажется, это в GAC, и я могу попробовать найти его с gacutil/l MyDllName. Однако в моем клиентском приложении, когда я ссылаюсь на него, во время выполнения при вызове CoCreateInstance я получаю REGDB_E_CLASSNOTREG (HRESULT). Я не вижу DLL в C: \ Windows \ Microsoft.NET/Assembly или в OLEVIEW.

Я пропустил какие-либо шаги или сделал что-то не так?

Благодаря

+1

Вы никогда не упоминали использование Regasm.exe для регистрации сборки. Вы можете пропустить это на своем компьютере-разработчике, когда вы используете флажок «Регистрация для COM-взаимодействия». Конечно, не на машине пользователя. Использование MIDL довольно странно, это не звучит кошерно. –

+0

, если вы не используете MIDL (как показано в учебнике по адресу http://codeingaddiction.blogspot.com/2011/06/how-to-add-strong-name-to-existing-dll_16.html), что такое "кошерный" способ сделать это? (Кстати, мой взгляд кишки с использованием MIDL был немного взломан) – Prof

+0

Обычно вы должны использовать директиву #import в программе на C++. –

ответ

2

Причина вы получаете ошибку REGDB_E_CLASSNOTREG потому, что ваш .net COM DLL не зарегистрирован. Любая сборка .net должна быть зарегистрирована для того, чтобы ее отображали как класс com для клиентов. Нам нужно использовать regasm.exe для регистрации сборки .net.

+0

Вот и я. Я все еще не вижу сборку в библиотеках типов в OLEVIEW (я могу на машине, где я построил COM-dll). Также, когда я пытаюсь вызвать метод на интерфейсе из моего клиентского приложения на моей целевой машине, я получаю «... не имеет адреса, возможно, из-за оптимизации компилятора». – Prof

+1

Это потому, что библиотека типов сборки не зарегистрирована. Вы можете зарегистрировать его, добавив параметр/tlb в regasm.exe, например, «regasm myTest.dll /tlb:myTest.tlb». Предыдущая команда регистрирует myTest.dll, а также генерирует и регистрирует библиотеку типов myTest.tlb. – vamsee

Смежные вопросы