Не удается создать COM-объект C # (класс не зарегистрирован) - PullRequest
0 голосов
/ 18 июля 2011

Моя глобальная цель - создать приложение на основе COM, где клиентская часть - это код C ++, а серверная часть - C #. Это выглядит просто.

Я пытаюсь использовать образец из MSDN: http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx

Я делаю решение с двумя проектами (используя VisualStudio2008) и компилирую. хорошо.

Я регистрирую компонент вручную. (Ref1)

Но когда я запускаю клиентское приложение, CoCreateInstance возвращает HRESULT "Класс не зарегистрирован".

на шаге (ref1) я пытаюсь использовать:

1) regasm server.dll /tlb:server.tlb (имена файлов в источнике cpp теперь совместимы по причине) (из MSDN)

2) regasm server.dll /tlb:server.tlb gacutil / i server.dll

3) regasm / codebase / tlb server.dll

В реестре см. Мой класс, но «значением по умолчанию» для InprocServer является mscore.dll. По сравнению с другими записями реестра, это выглядит как ошибка. Я попытался отредактировать это значение вручную - безрезультатно.

Но я уверен, этот образец работает! однажды я сделал много разных действий без изменения GUID и ... это работает! Но я меняю GUID, пытаюсь зарегистрироваться - безрезультатно. И я не могу повторить эту ситуацию. Магия ...

Помогите мне, пожалуйста! Мне нужен точный алгоритм без источника изменений (опция) и без ручной работы в реестре (в моем случае это абсолютно невозможно).

// простите, мб мой английский не идеален.

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

В реестре см. Мой класс, но «значением по умолчанию» InprocServer является mscore.dll

Нет, это не ошибка.Mscoree.dll является загрузчиком для CLR, он обеспечивает правильную загрузку и инициализацию CLR, что позволяет запускать управляемый код в собственном приложении без поддержки CLR.И он предоставляет точку входа DllGetClassObject, которую должен предоставить COM-сервер.Для управляемой сборки не существует общего способа иметь собственный экспорт, такой как DllGetClassObject.

Вам следует запустить regasm.exe с параметром / codebase на вашем компьютере разработчика, чтобы вам не приходилось регистрировать сборку вGAC с gacutil.exe.Который вы уже попробовали.Теперь у вас проблемы с реестром, нативная программа не может найти записи реестра, найденные вами с помощью Regedit.exe.Очень распространенная причина этого - работа в 64-битной операционной системе.Вам следует использовать 32-разрядную версию Regasm.exe (из Framework, а не Framework64), если COM-клиент является 32-разрядной программой.Чтобы информация о регистрации шла в HKLM \ Software \ Wow6432Node \ Classes \ CLSID вместо HKLM \ Software \ Classes \ CLSID.Wow6432Node - это различие, это дом для 32-битной регистрации.

Когда все остальное не удается, используйте утилиту SysInternals ProcMon.Позволяет увидеть, где нативная программа ищет в реестре регистрационные ключи.

0 голосов
/ 18 июля 2011

Я думаю, вы должны попробовать строку: regasm /codebase server.dll /tlb server.tlb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...