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

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

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

COMException был необработанным

Получение класса COM factory для компонент с 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);

Ответ 1

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

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

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

Ответ 2

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

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

Image 1 - Reference PropertyImage 2 - Platform Target

Ответ 3

Предполагая, что мы имеем небольшую информацию:

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


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

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

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

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

4) Существует проблема безопасности в запускается COM-сервер (это страницы, похоже, паролей или отсутствующих "Логин как Batch Job" для "Run As.." COM, но в любом случае я бы предложить повторную проверку этой информации для вашей конкретной конфигурации)

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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