0

少し背景:

たくさんのデータといくつかのマネージDLLを含むライブラリプロジェクトAがあります。このプロジェクトには(サイズが大きいため)独自のインストーラーがあり、個別にインストールできます。

次に、プロジェクトAもインストールされていることを検出したときに、追加機能を提供できる他のプロジェクトがいくつかあります。

セットアップ:プロジェクトAによって実装されるインターフェイスを含むInterface.dllを作成しました。他のすべてのプロジェクトにはこのDLLが含まれているため、実行時にプロジェクトAをロードして、特定のインターフェイスにキャストできます。

この問題はバージョン管理で発生します。インストールされたプロジェクトAが古いバージョンに依存しているときに、一部のプロジェクトに新しいバージョンのInterface.dllが含まれる場合があります。これが発生すると、キャストが機能しなくなります。

私はいくつかの可能性を検討しています:

  1. interface.dllを破棄し、すべてを動的にロードします。
  2. いくつかのバージョン検出と、プロジェクトAのバージョンを更新するようにユーザーに通知します。
  3. 他の通信手段(コマンドラインなど)を使用する
4

1 に答える 1

2

おそらく、interfaces.dllで定義され、プロジェクトAによって実装されたインターフェイスは変更されていませんか?たぶん、他のプロジェクトが新しいインターフェースを追加したばかりです。

ここで、昔ながらの.NETDLLのバージョン管理の問題が発生している可能性があります。プロジェクトA(A.exe?)はinterfaces.dllバージョン1.0.0.0に対してコンパイルされ、この情報はA.exeのメタデータに保存されます。interfaces.dllを1.0.0.1に更新すると、A.exeはそれを読み込めません。新しいDLLに下位互換性がある場合(キャストが機能するためには実際に必要です)、この互換性についてランタイムローダーに通知するポリシーファイルを提供できます。例えば:

<?xml version ="1.0"?>
<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="interfaces" culture="neutral" publicKeyToken="null"/>
        <bindingRedirect oldVersion="1.0.0.0-1.0.0.1" newVersion="1.0.0.1"/>
    </dependentAssembly>
    </assemblyBinding>
</runtime>
</configuration>

これは、アセンブリが1.0.0.0と1.0.0.1の間の任意のバージョンのinterfaces.dllをロードしようとする場合、バージョン1.0.0.1が受け入れ可能であることをローダーに通知します。標準パターンを使用して、DLLにちなんでこのファイルに名前を付けますpolicy.1.0.interfaces.xml。次に、A.exeと同じディレクトリに配置します(私は思います)。

または、interfaces.dllのバージョン番号を変更していない場合(実際に変更する必要があります)、別の問題が発生している可能性があります。IDが同じであるが実際には同じアセンブリではない2つのアセンブリがある場合、ランタイムローダーがそれらの1つをロードすると、2番目のアセンブリはロードされません。詳細はありますが、これがあなたの問題になる可能性は低いと思うので、今は詳しく説明しません。

于 2011-05-11T22:38:32.003 に答える