8

環境

GAC にバージョン 1.0 とバージョン 2.0 の 2 つの異なるバージョンのアセンブリがインストールされています。特定のバージョンとして 1.0 を参照しているアプリケーションを作成しました。

問題

アプリケーションを実行すると、常にバージョン 2.0 がロードされますが、アプリケーションは特にバージョン 1.0 を参照しています。

質問

なぜこうなった?アプリケーションがコンパイルされたバージョンを強制的にロードするにはどうすればよいですか?

私のアプリケーションはビルド時にバージョン 2.0 を認識しておらず、参照「特定のバージョン」メタデータが true に設定されているため、これがバインディング リダイレクトと関係があるとは思えません。

ありがとう。


編集:

私が参照しているアセンブリは、実際には ODAC パッケージの Oracle.DataAccess です。Policy.x.xxx.Oracle.DataAccess という名前の他のアセンブリが GAC で公開されていることに気付きました。


編集2:

Oracle.DataAccess ポリシーを調べたところ、バインディング リダイレクトを定義する構成が見つかりました。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="4.112.0.0-4.112.3.0" newVersion="4.112.3.0"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

アプリケーション構成にリバース バインディング リダイレクトを追加しましたが、GAC のポリシーが優先されているようです。この件を扱い、この構成でポリシーを無視することを提案しているMSDN の記事を見つけました。

<publisherPolicy apply="no" />

しかし、それでもうまくいきません...


編集3:

GAC からポリシーを削除しようとして、マシンを再起動しました。それはついに働いた。快適なソリューション開発のようには感じられませんが、このポリシーは私のアプリケーションの 1 つを壊しました。つまり、私の場合はポリシーを無効にすることが正しいことです。


最終編集:

イゴールは私に正しい答えをくれました。これらのポリシーを回避するために私がしなければならなかったpublisherPolicyのは、正しい構成セクションの設定を使用することだけでした:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
      <publisherPolicy apply="no"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>
4

1 に答える 1

7

質問を編集すると、これがアセンブリ バインディングに影響するポリシー ファイルであることが明らかになります。

Oracle の場合、次のような内容の Policy.XYOracle.DataAccess.config というファイルがあります。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="10.1.0.000-10.2.0.100" newVersion="10.2.0.100"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

ポリシーは Oracle インストーラーによってインストールされOracle.DataAccess.dll、最新バージョンにリダイレクトされます。これは、Oracle がライブラリに下位互換性があると考えているためです。

編集:発行者ポリシーを特定のアセンブリに適用したくない場合は、要素を要素に入れます:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="myAssembly" publicKeyToken="..."  culture="en-us" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
            <publisherPolicy apply="no" />
    </dependentAssembly>
</assemblyBinding>
于 2012-05-22T12:00:08.357 に答える