Проблема Регистрация сборок x64 для COM-взаимодействия

2

Я разработал образец С# COM-Visible DLL.
Построенный в x86 и зарегистрированный через 32-разрядный Regasm, он хорошо выполняет COM-клиент.
Построенный в x64 и зарегистрированный через 64-битный Regasm, вызов COM-клиента выдает следующую ошибку:

Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154.

Я проверил и убедился, что CLSID присутствует в реестре под HKCR\CLSID.

Ниже приведен пример моделирования COM-доступа с помощью С#:

var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type); // <-- blows here

Я также проверил через procmon, что есть успешный доступ к типу через progId Вопрос в том, где именно выглядит Активатор? и как заставить его "видеть" мою зарегистрированную сборку x64? есть что-то, что мне нужно добавить где-нибудь?

Я нашел много "решений", рекомендующих перестроить x86. Но приди! Я не собираюсь этого делать и теряю все преимущества x64 только ради COM. Есть ли "РЕАЛЬНОЕ" решение?

  • 0
    В каких ситуациях выдается ошибка 80040154?
  • 0
    @Ramhound Когда CLSID не существует или не находится в правильном ожидаемом месте. Так что я очень запутался.
Показать ещё 4 комментария
Теги:
registry

1 ответ

0
Лучший ответ

После ночи сна и маленькой ретроспективности я понял, что активатору нужно было позвонить из приложения x64, чтобы найти CLISID x64, посмотрев в местах x64 в реестре. т.е. при вызове из приложения x86 Activaor просматривает места x86 в реестре для CLSID и последующего ключа, включая базу кода.

var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type); 
  • 1
    Это потому, что x86 и x64 EXE / DLL (COM или другие) не смешиваются, как с подобным.
  • 0
    @sixlettervariables: да, это то, что я узнал со своим другим вопросом здесь: stackoverflow.com/questions/8193857/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню