#c# #.net #com #photoshop
#c# #.net #com #photoshop
Вопрос:
Я пытался написать некоторый код для взаимодействия с 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);
Комментарии:
1. Когда-нибудь я выясню, почему пользователи SO категорически отказываются документировать исключения, которые они получают. Я еще не близок к тому дню. Измените настройки целевой платформы вашего EXE-проекта на любой процессор.
2. Ваши COM-объекты Photoshop создаются в процессе или вне процесса (относительно вашего кода)? В процессе потребуется . Сеть построена на совместимой платформе, платформа вне процесса не должна иметь значения.
3. Да, отказываюсь. Вы получили запрос на это и все еще не задокументировали исключение. Отсутствие ответа является стандартным результатом.
4. @a2h — Отношение, которое проявляется только тогда, когда люди задают неполные вопросы.
Ответ №1:
Исполняемые файлы .NET-приложений (.exe) всегда будут выполняться в собственной разрядности используемой архитектуры процессора, если они помечены для AnyCPU, который компилируется вплоть до MSIL. Таким образом, любая сборка MSIL, запущенная на 64-разрядной платформе, будет выполняться 64-разрядной, а на 32-разрядной платформе — 32-разрядной.
В вашем случае вы либо захотите выполнить компиляцию для любого процессора, но если вам необходимо принудительное 64-разрядное взаимодействие, используйте x64. Конечно, это не будет работать на 32-разрядной машине. Изначально это будет считываться из 64-разрядного представления реестра (включая InProc
Вы также должны быть осторожны с тем, как маршалируются указатели. Обязательно используйте IntPtr для дескрипторов при написании собственного прокси-сервера взаимодействия.
Комментарии:
1. Будущие читатели: Я наконец-то получил в свои руки копию Visual Studio 2010; Все это время я использовал Express, поэтому не мог выбрать какой-либо процессор. Это означает, что, к сожалению, нет ответа, который, как я проверил, работал бы для пользователей Express. Не стесняйтесь создать ответ или указать на тот, который уже существует для пользователей Express, и я приму это к сведению.
Ответ №2:
Пара вещей, которые нужно проверить на предмет использования COM в разных средах:
- Переключите «Типы встроенного взаимодействия» для ссылки на COM (см. Изображение 1)
- Проверьте целевую платформу (см. Изображение 2)
Ответ №3:
Исходя из той небольшой информации, которой мы располагаем:
Цитируется из: Когда 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-серверы, но в любом случае я бы посоветовал перепроверить эту информацию для вашей конкретной конфигурации)
Ответ №4:
Я не очень разбираюсь в Photoshop API, поэтому попытаюсь ответить на ваш вопрос немного более обобщенно.
32-разрядные приложения не могут загружать 64-разрядный код в свое адресное пространство и наоборот. Это означает, что единственный способ объединить их — это некоторая форма взаимодействия между процессами.
COM обработает это взаимодействие между процессами за вас, если это нерабочий COM-сервер. Итак, если COM-объекты Photoshop реализованы как объекты вне процесса, тогда все будет работать нормально. Поскольку у вас это не работает, я предполагаю, что они используют в процессе объекты, которые нельзя смешивать между 32 и 64 битами. В этом случае вам нужно будет создать свой собственный сервер out of process, который оборачивает объекты Photoshop, которые вы хотите использовать. Затем вы могли бы использовать эту оболочку из процесса как из 32, так и из 64-разрядного кода.
Также, чтобы прояснить некоторые другие сообщения, в .NET вам нужно убедиться, что целевая платформа установлена на то, что вам нужно для того, чего вы пытаетесь достичь. x86 заставит ваш код всегда выполняться как 32-разрядный. x64 заставит его всегда выполняться как 64-разрядный. Любой процессор заставит его работать как 32-разрядный в 32-разрядной ОС и 64-разрядный в 64-разрядной ОС.
Ответ №5:
проблема 64/32-разрядных версий немного сложнее, поскольку вы можете запускать 32-разрядный photoshop на 32-разрядной ОС. Я бы попробовал ради тестирования установить для целевого проекта значение x64, и если это позволяет запускать photoshop 64, то вы могли бы даже скомпилировать свой код дважды (2 библиотеки DLL) и загрузить их в соответствии с версией photoshop.
Ответ №6:
перейдите в службы компонентов> компьютеры> Мой компьютер> Конфигурация DCOM> Photoshop RGBColor> идентификация> Интерактивный пользователь. и установите на вкладке безопасность разрешение для учетной записи администратора