Вопрос

Сценарий: у меня есть проект, включающий два проекта 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-разрядных компьютерах разработки?

Это было полезно?

Решение

Мы столкнулись с этой проблемой и решили ее, настроив проекты для генерации сборок для x86. Конечно, это неоптимально, но у нас также есть несколько нативных 32-битных библиотек, так что мы все равно должны были это сделать.

Другие советы

Мне удалось решить эту проблему с помощью следующего элемента базы знаний. В основном я отключил регистрацию COM-взаимодействия в настройках сборки проекта и использовал команду post-build:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top