古いアセンブリのインターフェイスでコンパイルされた.Netアプリケーションは、新しいバージョンでオブジェクトを作成できますか?

リッチシーラー

C#デスクトップコードで使用しているサードパーティのアプリケーションがあります。製造元が提供するライブラリのいくつかのインターフェイスを使用しています。ライブラリは多くのDLLで構成されており、そのうちの1つにインターフェイス用にアクセスします。彼らがアプリケーションの新しいバージョンをリリースするとき、私はいくつかの問題を抱えていることがわかりました。

インストールコードは、開発マシンで参照していたDLLをプロジェクトのbinフォルダーにコピーしました。インターフェイスのconcreateインスタンスを実装する前に、一時的にDLLへのパスを追加し、ビルド中にコピーしないことで、これを修正しました。

問題は、オブジェクトを作成できないことです。エラーは次のとおりです。

Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’.

これは、私のソースコードが別のバージョンのDLLを参照しているためだと思います。プログラムが実行されると、コンパイルされたものと同じではないことがわかります。これは、署名がバージョン間で同じであり、公開鍵トークンが同じであってもです。

VS Object Explorerで使用するインターフェイスの署名を視覚的に比較しましたが、それらは一致しています。

新しいDLLを自分のマシンのフォルダーにコピーし、そのフォルダーを参照することで、別の方法を試しました。コンパイル後、コンピューターでキャストエラーが発生し、テストコンピューターで動作します。

そうでなければ、バインディングリダイレクトはどのように機能するのでしょうか?

アセンブリを手動でロードすることを考えましたが、メソッドにアクセスするにはどうすればよいですか?ルックアップ方法を見ると、簡単ではないようです。自分のインターフェースとアダプターを作成して、それらを自分のものにマップする必要があるので、一度検索しますか?

リッチシーラー

解決策は、メインアプリケーションのApp.ConfigでBindingRedirectを使用することでした。これは、プログラムのコンパイル時に参照したアセンブリのバージョンを反映しています。

ターゲットアセンブリを参照するプロジェクトのApp.Configに配置しようとしましたが、目立った効果はありませんでした。XMLのブロックをメインの実行可能ファイルApp.Configに移動すると、それが機能しました。

<configuration>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="SDK.NET.Interface"
                          publicKeyToken="865eaf3445b2ea56"
                          culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535"
                         newVersion="17.1.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

サイドノート。参照されたdllがメインの実行可能ファイルで参照されていなかったため、インストーラーのセットアップファイルリストに手動で追加する必要がありました。長期的には、このモジュールはオプションであり、この依存関係を必要としない可能性があるため、メインプロジェクトの参照に追加したくありませんでした。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ