COM интерфейс Photoshop проблема совместимости


Мы пишем простое приложение .NET C# COM для Photoshop, которое предназначено для работы на всех версиях от CS2 до CS5 и все между ними. То же самое приложение также существует в форме JavaScript и работает со всеми вышеупомянутыми версиями, поскольку мы избегали реализации специфической функциональности версии.

Проблема, с которой мы столкнулись, связана с интерфейсом COM. Например, если наше приложение компилируется с помощью взаимодействия.Фотошоп файлов из Photoshop CSX, это не работает на Photoshop CSy. Это, по-видимому, связано с тем, что CLSID реестра специфичен для каждой версии Photoshop, в результате чего наше приложение не находит правильную библиотеку DLL COM-интерфейса, если оно запущено в системе, где установлена другая версия Photoshop, чем та, для которой мы скомпилировали (предполагая, что оба приложения являются 32-разрядными).

Если это действительно проблема, мы задаемся вопросом, Можно ли было бы повторно зарегистрировать COM-интерфейс Photoshop версии CSx с CSY CLSID, игнорируя тот факт, что функциональность может отличаться в разных версиях.

Далее следует более конкретная информация:

Наш основной фотошоп.Идентификатор CLSID приложение находится здесь в реестра: HKEY_CLASSES_ROOTфотошоп.ПрименениеCLSID Этот CLSID должен соответствовать CLSID, для которого было создано наше приложение. Например, этот идентификатор отличается между CS5 и CS5. 1.

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

Код ошибки, который мы получаем, - 0x80040154, "получение фабрики класса COM для компонента с CLSID {116EE066-135E-4F63-8D0E-78F62705FBFC} не удалось". Это приложение было построено с CS5. 1, но запускалось на CS5. 04, что привело к тому, что интерфейс COM не был найден. Это CLSID является специфическим для CS5 и выше.1. В заключение, мы должны повторно зарегистрировать COM-интерфейс, чтобы соответствовать CLSID CS5. 04, чтобы иметь возможность запускать наше приложение на этом конкретном версия. Возможно ли это или есть другой путь?

Любая помощь или подсказка, которую мы можем получить по этому вопросу, чрезвычайно ценится.
1 3

1 ответ:

Изменение GUID COM-классов и интерфейса-это жесткое требование, оно позволяет избежать DLL-Ада. Чтобы вызвать нормальную проблему, с которой Вы имеете дело прямо сейчас: версия Ада. При попытке использовать версию фрагмента кода, который не установлен на компьютере, вы получаете диагностическое сообщение вместо случайного недиагностируемого сбоя. Вы не можете надежно перерегистрироваться, что может серьезно испортить машину вашего клиента.

Да, вы можете сделать это так, как это делает Javascript: использовать позднюю привязку. Вы не используйте библиотеку взаимодействия. Это очень болезненно делать в C#, если вы используете версию более раннюю, чем 4,Вы должны использовать отражение. Но сделать это легко VB.NET или с ключевым словом C# версии 4 dynamic. Эта статья KB показывает позднюю привязку в C#, используя старый способ. С помощью ключевого словаdynamic Вы можете написать код, который вы написали сейчас, кроме синтаксиса создания объектов. Любая проблема несоответствия версий все равно вызовет исключение, но только в вызов свойства или метода и только во время выполнения, а не во время компиляции.