4

Photoshop用のシンプルな.NETC#COMアプリケーションを作成しています。これは、CS2からCS5までのすべてのバージョン、およびその間のすべてのバージョンで実行するように設計されています。同じアプリケーションがJavaScript形式でも存在し、バージョン固有の機能の実装を回避したため、前述のすべてのバージョンで動作します。

私たちが遭遇した問題は、COMインターフェースに関連しています。たとえば、アプリケーションがPhotoshopCSxのInterop.PhotoshopDLLを使用してコンパイルされている場合、PhotoshopCSyでは実行されません。これは、レジストリCLSIDがPhotoshopの各バージョンに固有であり、コンパイルしたものとは異なるバージョンのPhotoshopがインストールされているシステムで実行した場合、アプリケーションが正しいCOMインターフェイスDLLを見つけられないためと思われます(両方のアプリケーションを想定) 32ビットです)。

これが本当に問題である場合、機能がバージョン間で異なる可能性があるという事実を無視して、PhotoshopバージョンCSxのCOMインターフェイスをCSyCLSIDに再登録できるかどうか疑問に思っています。

より具体的な情報は次のとおりです。

プライマリPhotoshop.ApplicationCLSIDは、レジストリの次の場所にあります。HKEY_CLASSES_ROOT \ Photoshop.Application \ CLSIDこのCLSIDは、アプリケーションが構築されたCLSIDと一致する必要があります。たとえば、このIDはCS5とCS5.1で異なります。

今日の唯一の解決策は、Photoshopの特定のバージョン用にアプリケーションの特定のバージョンをビルドすることです。これは、特定のアプリケーションバージョンがインストールされている場合にのみ可能です。

取得したエラーコードは0x80040154、「CLSID{116EE066-135E-4F63-8D0E-78F62705FBFC}を持つコンポーネントのCOMクラスファクトリの取得に失敗しました」です。このアプリケーションはCS5.1で構築されましたが、CS5.04で実行されたため、COMインターフェイスが見つかりませんでした。このCLSIDはCS5.1に固有です。結論として、特定のバージョンでアプリケーションを実行できるようにするには、CS5.04のCLSIDと一致するようにCOMインターフェイスを再登録する必要があります。これは可能ですか、それとも別の方法がありますか?

私たちがこの問題について得ることができるどんな助けやヒントも非常にありがたいです。

4

1 に答える 1

4

COMクラスとインターフェイスのGUIDを変更することは難しい要件であり、DLL地獄を回避します。現在扱っている通常の問題を呼び出すには:バージョン地獄。マシンにインストールされていないバージョンのコードを使用しようとすると、診断できないランダムな障害ではなく、診断メッセージが表示されます。確実に再登録することはできません。これは、顧客のマシンを深刻に混乱させる可能性があります。

はい、Javascriptと同じように実行できます。遅延バインディングを使用します。相互運用ライブラリは使用しません。4より前のバージョンを使用する場合、C#で行うのは非常に面倒です。リフレクションを使用する必要があります。ただし、VB.NETまたはC#バージョン4の動的キーワードを使用すると簡単に実行できます。このKB記事は、古い方法を使用したC#での遅延バインディングを示しています。dynamicキーワードを使用すると、オブジェクト作成構文以外のコードを現在の方法で記述できます。どんな種類のバージョンの不一致の問題でも例外が発生しますが、プロパティまたはメソッドの呼び出しでのみ、実行時にのみ発生し、コンパイル時では発生しません。

于 2011-05-10T10:54:46.917 に答える