COM-интерфейс Photoshop проблема совместимости - PullRequest
4 голосов
/ 10 мая 2011

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

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

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

Более подробная информация приведена ниже:

Наш основной CLSID для Photoshop.Application находится здесь в реестре: HKEY_CLASSES_ROOT \ Photoshop.Application \ 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 Ответ

4 голосов
/ 10 мая 2011

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

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

...