Возможно ли взаимодействие с 64-битным COM-сервером (Photoshop) из .NET? - PullRequest
11 голосов
/ 12 мая 2011

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

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

Исключение COMException не обработано

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

Возможно ли, чтобы мое приложение связывалось с 64-битной версией Photoshop?Или это ограничивается просто связью с 32-битной версией?

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

Исключение возникает здесь:

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

Ответы [ 6 ]

1 голос
/ 04 июля 2011

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

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

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

1 голос
/ 13 июня 2011

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

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

Image 1 - Reference Property Image 2 - Platform Target

0 голосов
/ 16 мая 2019

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

0 голосов
/ 30 июня 2011

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

0 голосов
/ 15 июня 2011

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

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

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

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

0 голосов
/ 17 мая 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-серверы, но в любом случае я бы предложить повторно проверить эту информацию для вашей конкретной конфигурации)

...