1

私は C# でクリップボード/画像アップロード ツールを作成しています。キーコンボでスクリーンショットを作成し、画像をプラグインに送信すると、プラグインが URL のアップロードと返信を処理します。

さて、これらのプラグインは設定を保存する必要があり、それらの設定はアプリケーション内で編集可能にする必要があるため、少し前に書いたデータ保存クラスを使用して、そのクラスの初期化されたインスタンスの参照をプラグイン。

アイデアは、そのクラス全体をインクルードに入れることでした。これは、プラグイン作成者がデータを処理するためにプロジェクトに含めることができますが、プラグインとメイン アプリケーションの両方がまったく同じコードを使用しているにもかかわらず、バージョンが異なるというエラーが発生します。 、つまりこれ:

{"[A]CedInc.Persistence.XMLPersistenceDictionary.savenode は [B]CedInc.Persistence.XMLPersistenceDictionary.savenode にキャストできません。タイプ A は、コンテキスト 'Default' at location 'C:\git\CloudBoard\CloudBoard\bin\Debug\CloudBoard.exe'. タイプ B は 'CloudBoard FTP upload plugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' に由来しますロケーション「C:\git\CloudBoard\CloudBoard\bin\Debug\plugins\CloudBoard FTP upload plugin.dll」のコンテキスト「LoadFrom」。"}

私の質問は次のとおりです。カスタム クラスのインスタンスを、プラグイン自体によって読み込まれるアセンブリに配置することなく、プラグインに渡すことは可能ですか? もしそうなら、どのように?どんなアイデア/提案も大歓迎です! 私はちょっとここで立ち往生しています。

4

2 に答える 2

1

共有アセンブリ バージョンをお勧めしますが、プラグインの作成者に、定義済みのクラス名とメソッド名を含むテンプレート コード ファイルを提供することもできます。次に、リフレクションを使用して、読み込まれたアセンブリを検索し、定義済みのシグネチャに一致するクラスとメソッドを見つけることができます。メソッドが見つかったら、簡単に呼び出すことができます。

于 2012-06-18T17:16:37.357 に答える
0

プラグインがコードをまったく参照しないことを期待していますか?

この場合、クラスの代わりにプラグインに渡されるように機能するフレームワークアセンブリ内のインターフェイスを見つけることができる場合があります。多分IDictionaryまたはIDictionary<string,string>うまくいくでしょう。このように、プラグインはシリアル化のためにアセンブリを参照する必要がなく、カスタム実装を渡すことができます。プラグインの作成者にとっての副次的な利点として、プラグインの単体テストを行う方がはるかに便利です(具体的なクラスがランダムライブラリを形成する場合、それははるかに困難です)。

于 2012-06-18T17:40:06.817 に答える