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

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

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

Если это действительно проблема, мы задаемся вопросом, можно ли было бы перерегистрировать COM-интерфейс версии Photoshop CSx с помощью CSy 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 ответ

Решение

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

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

Другие вопросы по тегам