Класс не зарегистрированная ошибка для создания объекта C # через COM из VC ++ - PullRequest
9 голосов
/ 15 марта 2012

В проекте VC ++ я пытаюсь создать экземпляр (через COM) класса C #, содержащегося в проекте C #.

Факты

  • И C #, и C ++проекты компилируются с использованием .NET 4.0
  • . C # .dll регистрируется с использованием regasm / codebase "CSharpProjectName.dll"", а отчеты командной строки Windows" Типы зарегистрированы успешно. "1010 *
  • В проекте c ++ я пытаюсь создать экземпляр класса в проекте C #, но получаю HRESULT 0x80040154 - класс не зарегистрирован

Вот пример моей попытки создать экземпляр объекта .NET из C # .dll. Конкретный класс, который я пытаюсь создать, называется Employee, который просто для представления моего вопроса реализует интерфейс IPerson:

    CSharpProjectName::IPersonPtr pPersonPtr;
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee);

Почему я получаю сообщение об ошибке «класс не зарегистрирован», хотя я зарегистрировал c # .dll с помощью «regasm / codebase» и подтвердил наличие ключа в реестре?

Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

9 голосов
/ 15 марта 2012

У меня была такая проблема в прошлом, и это было связано с тем, что оба процесса не были 32- или 64-битными. Если вы работаете с 32-битной ОС, вы можете прекратить чтение сейчас, потому что то, что я говорю, неприменимо.

Используйте regedit, чтобы попытаться найти ваши ProgIds и CLSID в реестре. Если ваш проект C ++ является 32-разрядным, убедитесь, что ваши классы C # были зарегистрированы в 32-разрядном кусте - HKEY_CLASSES_ROOT \ Wow6432Node. Если ваш C ++ проект 64-битный, убедитесь, что ваши классы C # были зарегистрированы в 64-битном кусте - HKEY_CLASSES_ROOT.

Если вам нужно зарегистрироваться в 64-битном кусте, вам может потребоваться вызвать версию RegAsm.exe по адресу c: \ windows \ microsoft.net \ framework64 ...

Другая возможность того, что что-то пойдет не так, заключается в том, что вам может потребоваться запустить regasm.exe .NET 4.0 версии. Если вы просто наберете «regasm» в командной строке, это даст вам версию regasm, которую вы используете. Возможно, вам потребуется ввести полный путь к версии .NET 4.0 regasm, который находится по адресу c: \ windows \ microsoft.net \ framework \ v4.0.3019 \ regasm.exe.

1 голос
/ 15 марта 2012

Вы пробовали вариант /tlb?Попробуйте это, а затем

#import "your_tlb_file_lol.tlb" no_namespace

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

0 голосов
/ 29 января 2018

Попробуйте оставить свой проект в 32 битах, потому что вы знаете свой проект, создавая в любом процессоре активный компонент, который работает на 32 с ошибкой реестра, поэтому измените сборку на 32 или предпочтительно на 32.

Вы тоже регистрируете свою dll с помощью regsvr32

...