Возможно ли взаимодействие с 64-битным COM-сервером (Photoshop) из .NET?

Я пытался написать код для взаимодействия с Photoshop, как путем добавления ссылки на COM, так и путем позднего связывания. Мне потребовалось время, чтобы понять, что код действительно работает, но не с 64-битной версией Photoshop.

Исключение, которое я получаю с 64-битным Photoshop, выглядит следующим образом:

COMException не обработано

Получение фабрики классов COM для компонента с CLSID {D9389EDE-AEF8-4092-9377-075E94B7CB9A} не удалось из-за следующей ошибки: 80080005 Ошибка выполнения сервера (исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

Может ли мое приложение взаимодействовать с 64-разрядной версией Photoshop? Или это ограничивается только общением с 32-битной версией?

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

Исключение здесь:

Type photoshopType = Type.GetTypeFromProgID("Photoshop.Application");
if (photoshopType != null)
{
    object photoshop = Activator.CreateInstance(photoshopType);

person unrelativity    schedule 12.05.2011    source источник
comment
Когда-нибудь я пойму, почему пользователи SO категорически отказываются документировать получаемые исключения. Я еще не близок к тому дню. Измените настройку целевой платформы вашего EXE-проекта на Any CPU.   -  person Hans Passant    schedule 12.05.2011
comment
Ваши COM-объекты Photoshop создаются в процессе или вне процесса (относительно вашего кода)? В процессе потребуется .Net, построенная на совместимой платформе, вне процесса платформа не имеет значения.   -  person morechilli    schedule 16.05.2011
comment
Да откажитесь. Вам было предложено это сделать, но исключение все еще не задокументировано. Не получить ответа - стандартный результат.   -  person Hans Passant    schedule 16.05.2011
comment
@ a2h - отношение, которое проявляется только тогда, когда люди задают неполные вопросы.   -  person Security Hound    schedule 15.06.2011


Ответы (6)


Исполняемые файлы приложений .NET (.exe) всегда будут выполняться с собственной разрядностью архитектуры работающего процессора, если они отмечены для AnyCPU, который компилируется до MSIL. Таким образом, любая сборка MSIL, работающая на 64-разрядной платформе, будет работать с 64-разрядной версией, а на 32-разрядной платформе - с 32-разрядной.

В вашем случае вы либо захотите скомпилировать для AnyCPU, но если вам нужно принудительно использовать 64-битное взаимодействие, используйте x64. Конечно, это не сработает на 32-битной машине. Это будет изначально считываться из 64-битного представления реестра (включая InProc

Вы также должны быть осторожны с тем, как маршалируются указатели. Обязательно используйте IntPtr для дескрипторов, если пишете собственный прокси-сервер взаимодействия.

person Heath    schedule 04.07.2011
comment
Будущие читатели: наконец-то я получил копию Visual Studio 2010; Все это время я использовал Express, поэтому не смог выбрать AnyCPU. Это означает, что, к сожалению, нет ответа, который я проверил для работы с пользователями Express. Не стесняйтесь создавать ответ или указывать на тот, который уже существует для пользователей Express, и я приму его к сведению. - person unrelativity; 05.02.2012

Несколько вещей, которые нужно проверить при использовании COM из / в разных средах:

  1. Переключите «Embed Interop Types» для ссылки на COM (см. Изображение 1)
  2. Проверьте цель платформы (см. Изображение 2)

Изображение 1 - эталонное свойство Изображение 2 - Целевая платформа

person Aaron Barker    schedule 13.06.2011

Исходя из имеющейся у нас небольшой информации:

Цитируется по: Когда CoCreateInstance возвращает 0x80080005 (CO_E_SERVER_EXEC_FAILURE)


... Если клиенту не удается вызвать CoRegisterClassObject () с момента запуска процесса или вообще не удается вызвать CoRegisterClassObjects () для данной фабрики классов, то клиент получит ошибку CO_E_SERVER_EXEC_FAILURE в CoCreateInstance (...) . Это может произойти по разным причинам:

1) Машина имеет высокую загрузку ЦП, и процесс занимает много времени для запуска и выполнения CoRegisterClassObjects () менее чем за 120 секунд.

2) COM-сервер не регистрируется для правильных идентификаторов классов.

3) COM-сервер в настоящее время останавливается, и существует состояние гонки между CoCreateInstance и останавливающей частью COM-сервера.

4) Существует проблема безопасности в способе запуска COM-сервера (эта страница, кажется, предлагает неправильные пароли или отсутствие привилегии «Вход в качестве пакетного задания» для COM-серверов «Запуск от имени ...», но в любом случае я бы предложил повторно проверка этой информации для вашей конкретной конфигурации)

person arul    schedule 17.05.2011

Я не очень разбираюсь в Photoshop API, поэтому я попытаюсь ответить на ваш вопрос в более общем плане.

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

COM будет обрабатывать это межпроцессное взаимодействие за вас, если это внепроцессный COM-сервер. Так что, если COM-объекты Photoshop реализованы как внепроцессные объекты, все будет работать нормально. Поскольку это не работает для вас, я предполагаю, что они используют объекты процесса, которые нельзя смешивать между 32 и 64 битами. В этом случае вам нужно будет создать собственный внепроцессный сервер, который будет обертывать объекты Photoshop, которые вы хотите использовать. Затем вы можете использовать эту внепроцессную оболочку как из 32-битного, так и из 64-битного кода.

Также, чтобы прояснить некоторые другие сообщения, в .NET вам нужно убедиться, что цель платформы установлена ​​на то, что вам нужно для того, что вы пытаетесь выполнить. x86 заставит ваш код всегда работать как 32-битный. x64 заставит его всегда работать как 64-битный. Любой процессор заставит его работать как 32-битный в 32-битной ОС и 64-битный в 64-битной ОС.

person dschaeffer    schedule 15.06.2011

проблема 64/32-битных версий немного сложнее, так как вы можете запустить 32-битный фотошоп на 32-битной ОС. Я бы попытался ради тестирования установить цель проекта на x64, и если это может запустить photoshop64, вы даже можете дважды скомпилировать свой код (2 dll) и загрузить их в соответствии с версией Photoshop.

person tamshi    schedule 30.06.2011

перейдите в службы компонентов> компьютеры> Мой компьютер> Конфигурация DCOM> Photoshop RGBColor> личность> Интерактивный пользователь. и установите на вкладке безопасности разрешение для учетной записи администратора

person Mohsen Meshkini    schedule 16.05.2019