1

複数のプラグインを動的に実行できるアプリケーションがあります。アプリケーションをインストールした後、ユーザーは適切なプラグインをインストール ディレクトリにドロップするだけで、プログラムはインターフェイスに基づいてそれらを動的にロードします。

私が直面している問題は、プラグインがメイン アプリケーションのライブラリを参照して、正しいインターフェイスにアクセスし、グローバル設定を共有することです。ユーザーが再インストールする必要なく、いつでもプラグインを追加できるようにしたいと考えています。ただし、プラグインはライブラリを参照するため、それらを読み込もうとすると、次のエラーが発生します。

Could not load file or assembly 'program', Version=0.1.0.24838, Culture=neutral, PublicKeyToken=623917...' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

すべてのプラグインをインストーラーに追加すると、このエラーを回避できることはわかっていますが、後で新しいプラグインを追加すると、ユーザーはアンインストールして再インストールする必要があります。プラグインを動的にロードする理由は、ユーザーが新しいプラグインをドロップするだけで機能するようにするためです。

アプリケーションのバージョンを気にせずにプラグインがメイン アプリケーションのオブジェクトを参照する方法はありますか?

ありがとう。

4

2 に答える 2

2

変更がプラグインアセンブリバージョンのみである場合は、変更されたアセンブリに対してランタイムバインディングリダイレクトを使用できます。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

別のパッチ(zipファイル)を介して更新を提供できます。(インストール/アンインストールの必要はありません)。

于 2013-01-10T19:39:35.697 に答える
1

一般的なアプローチは、明示的なバージョン (インターフェイスが変更された場合にのみ変更される) を持つ特別な「パブリック インターフェイス」アセンブリを作成し、プラグインとメイン アプリの両方をそのアセンブリにリンクすることです。このようなアセンブリに下位互換性を提供し、バインディング リダイレクトを使用する必要があります (つまり、Tilak の +1 回答に示されているように構成します)。

于 2013-01-10T19:41:48.297 に答える