Я разработал образец С# 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. Есть ли "РЕАЛЬНОЕ" решение?
После ночи сна и маленькой ретроспективности я понял, что активатору нужно было позвонить из приложения x64, чтобы найти CLISID x64, посмотрев в местах x64 в реестре. т.е. при вызове из приложения x86 Activaor просматривает места x86 в реестре для CLSID и последующего ключа, включая базу кода.
var type = Type.GetTypeFromProgID("ProgID.Interop.5683");
var obj = Activator.CreateInstance(type);