0

アプリにODP.Netの使用を実装しているときに、バージョンに潜在的な問題が発生したため、クイックテストアプリをノックアップして、影響があるかどうかを確認しました。

オラクルにアプリを持っている、または望んでいるクライアントがいますが、それらは異なるバージョンを使用しており、通常、ワークステーションにデプロイされているOracleクライアントのバージョンの企業標準があります。私たちのアイデアは、固定バージョンのODPに加えて、適切なインスタントクライアントを(プログラムディレクトリ内の)アプリとともにデプロイすることでした。これは、Oracleが、クライアントの特定のバージョンに対して、いずれかの側で2つのメジャーバージョンの互換性を保証するためです。 10.1ODPとクライアント11.1のデプロイを使用した理論上のOracle12まで。

それは問題ありませんが、問題は、クライアントが新しいバージョンのODPをGACに登録するOracleクライアントの上位バージョンと、アプリケーションに新しいバージョンを使用するように指示するパブリッシャーポリシーをデプロイする場合に発生します。使用するEL5とODPの特定のバージョンで構築されたEntlibContrib(ODPラッパー)からの1つのライブラリのカスタム実装を使用しており、新しいバージョンをGACにデプロイすると、テストアプリで証明されているように、これが失敗します。

これをテストするために、Win 7 x86がインストールされたクリーンなVMを使用してから、Oracle Client 10.2(GACにODP 10.2を登録)を追加し、テストアプリでODPとClient11.1を使用しました。これは正常に機能したので、GACに登録されたODPを使用してクライアント11.2をインストールしました。これにより、パブリッシャーポリシーも追加され、テストアプリが失敗することが証明されました。

これを回避するために、次のようにapp.manifestに依存関係エントリを追加しました。

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Oracle.DataAccess"
          version="2.111.7.20"
          processorArchitecture="x86"
          publicKeyToken="89b483f429c47342"
       />
    </dependentAssembly>
  </dependency>

これは、デプロイしているODPバイナリのバージョンと公開鍵と一致するため、テストアプリで使用することを期待していました。ただし、アプリを起動すると、次のエラーが発生しました。

The application has failed to start because its side-by-side configuration is incorrect.

また、イベントログには次のものが含まれます。

Activation context generation failed for "C:\Program Files\OPT\OPT\OraclePerformanceTester.exe". Dependent Assembly Oracle.DataAccess,processorArchitecture="x86",publicKeyToken="89b483f429c47342",type="win32",version="2.111.7.20" could not be found. Please use sxstrace.exe for detailed diagnosis.

sxstraceを使用すると、次の出力が得られました。

Begin Activation Context Generation.
Input Parameter:
    Flags = 0
    ProcessorArchitecture = x86
    CultureFallBacks = en-US;en
    ManifestPath = C:\Program Files\OPT\OPT\OraclePerformanceTester.exe
    AssemblyDirectory = C:\Program Files\OPT\OPT\
    Application Config File = C:\Program Files\OPT\OPT\OraclePerformanceTester.exe.Config

INFO: Parsing Application Config File C:\Program Files\OPT\OPT\OraclePerformanceTester.exe.Config.
INFO: Parsing Manifest File C:\Program Files\OPT\OPT\OraclePerformanceTester.exe.
INFO: Manifest Definition Identity is OraclePerformanceTester.exe,version="1.0.0.0".
INFO: Reference: Oracle.DataAccess,processorArchitecture="x86",publicKeyToken="89b483f429c47342",type="win32",version="2.111.7.20"
INFO: Resolving reference Oracle.DataAccess,processorArchitecture="x86",publicKeyToken="89b483f429c47342",type="win32",version="2.111.7.20".
INFO: Resolving reference for ProcessorArchitecture x86.
    INFO: Resolving reference for culture Neutral.
        INFO: Applying Binding Policy.
            INFO: No publisher policy found.
            INFO: No binding policy redirect found.
        INFO: Begin assembly probing.
            INFO: Did not find the assembly in WinSxS.
            INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Oracle.DataAccess\2.111.7.20__89b483f429c47342\Oracle.DataAccess.DLL.
            INFO: Attempt to probe manifest at C:\Program Files\OPT\OPT\Oracle.DataAccess.DLL.
            INFO: Attempt to probe manifest at C:\Program Files\OPT\OPT\Oracle.DataAccess.MANIFEST.
            INFO: Attempt to probe manifest at C:\Program Files\OPT\OPT\Oracle.DataAccess\Oracle.DataAccess.DLL.
            INFO: Attempt to probe manifest at C:\Program Files\OPT\OPT\Oracle.DataAccess\Oracle.DataAccess.MANIFEST.
            INFO: Did not find manifest for culture Neutral.
        INFO: End assembly probing.
ERROR: Cannot resolve reference Oracle.DataAccess,processorArchitecture="x86",publicKeyToken="89b483f429c47342",type="win32",version="2.111.7.20".
ERROR: Activation Context generation failed.

参照されるファイル(Oracle.DataAccess.dll)は、実行可能ファイルの隣のプログラムディレクトリに存在し、他のすべての依存関係もありますが、何らかの理由でそれを取得しません。私が以前に使用しなければならなかった唯一のマニフェストは、正常に機能したexeのUACチェックであり、私が見る限り、パブリッシャーポリシーをオーバーライドする正確なバージョンを指定する手順に従いました。私は何を間違えましたか?

乾杯

4

1 に答える 1

0

ハンス・パッサント(私に答えをくれた)が公式の答えを追加していないので、答えを追加します。さらに、ハンスの答えは私が見つけた他の答えと似ていますが、あまり明確ではなかったので、それを拡張したいと思います。彼らは物語の一部しか語っていないからです。

app.configに追加することは確かに機能しますが、これはapp.configのどこに行くべきかを<publisherPolicy apply="no" />説明していないと言っているほとんどすべての場所で見つかりました。次のようなセクションにこれを追加する必要があります。<runtime>

<configuration>
    <!--Other Sections-->
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
             <!--Ensures Oracle Publisher Policies don't override the version of ODP being used.-->
                <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
                <publisherPolicy apply="no"/>
              </dependentAssembly>
        </assemblyBinding>
    </runtime>
    <!--Other Sections-->
</configuration>

場合によっては、必要に応じてアセンブリ名と公開鍵を変更する必要があります。以上です。マニフェストファイルの使用について、通常は信頼できる情報源からダフ情報が提供されたので、ここでのレッスンは、負荷をかける前に情報を再確認することです。時間をかけて試してみると、おそらく時間の無駄になります。

于 2012-05-09T14:29:40.913 に答える