Сценарий: у меня есть проект, включающий два проекта C #, которые по историческим причинам должны общаться друг с другом, используя COM (через COM Interop). COM-сервер - это объект автоматизации процесса (назовите его «Сервер»), а COM-клиент - это простое консольное приложение C #, которое загружает сервер следующим образом:
var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
var objLateBound = Activator.CreateInstance(objType);
Visual Studio автоматически регистрирует сборки для COM-взаимодействия, если эта опция включена в настройках проекта, поэтому я использую ее для регистрации сервера (меня интересует только опыт разработчика, установка - отдельная проблема) и все остальное работает нормально, если проекты настроены на генерацию 32-битного кода или COM-клиент 32-битный.
Проблема возникает при разработке на 64-битной системе, и оба проекта настроены на генерацию кода для «Любого процессора», в результате чего они работают в 64-битном режиме. Это приводит к следующей ошибке:
"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."
После некоторого расследования кажется, что сценарии MSBuild выполняют только 32-битную регистрацию. Он помещает ProgID в раздел 64-битного реестра вместе с его ключом CLSID и соответствующим classID. Но CLSID {clsid} не существует. Это только в поддереве WOW6432, для 32-битных. Таким образом, активатор не может получить фабрику классов, потому что он не может ее найти.
Я буду очень впечатлен SO-сообществом, если получу ответ на этот вопрос, но здесь пойдет:
Кто-нибудь еще сталкивался с этой проблемой? Как ты это решил? Какой самый простой способ обеспечить правильную регистрацию сборок COM-взаимодействия на 64-разрядных компьютерах разработки?