ODP.Netの使用をアプリケーションに実装している間、私はバージョンの潜在的な問題に遭遇したので、私たちに影響を与えるかどうかを確認するために簡単なテストアプリケーションをノックアップしました。app.manifestで厳密な参照バージョンを指定する
私たちは、Oracle上でアプリケーションを持っているか、または必要としているクライアントを持っていますが、それらは異なるバージョンを使用しており、一般にワークステーションに配備されたOracleクライアントのバージョンの企業標準を持っています。私たちのアイデアは、ODPの固定版と適切なインスタントクライアントを、アプリケーションディレクトリ(プログラムディレクトリ内)にデプロイすることでした.Oracleは2つの主要バージョンの互換性を保証しています。例えば、Oracle ODPとClient 11.1の導入を使用して、理論上のOracle 12までの10.1
クライアントは、新しいバージョンのODPをGACに登録するOracleクライアントの上位バージョンと、アプリケーションに新しいバージョンを使用するように指示するパブリッシャポリシーを導入すると問題が発生します。我々は、使用しているEL5とODPの特定のバージョンで構築されたEntlibContrib(ODPラッパー)からの1つのライブラリのカスタム実装を使用しており、新しいバージョンをGACにデプロイすると、テストアプリケーションで証明されているように、
これをテストするには、Win 7 x86がインストールされたクリーンなVMを使用し、Oracle Client 10.2(GDPにODP 10.2を登録しました)を追加し、テストアプリでODPとクライアント11.1を使用しました。これはうまくいきましたので、GDPに登録されたODPをクライアント11.2にインストールしました。これにより、パブリッシャーポリシーも追加され、テストアプリケーションが失敗することが証明されました。
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Oracle.DataAccess"
version="2.111.7.20"
processorArchitecture="x86"
publicKeyToken="89b483f429c47342"
/>
</dependentAssembly>
</dependency>
これは、我々は私がテストアプリを期待していたので、展開されているODPバイナリのバージョンと公開鍵と一致する:
は、この問題を回避するために私はこのようなapp.manifestへの依存関係のエントリを追加しましたこれを使って。しかし、アプリを起動するには、私は次のようなエラーました:
The application has failed to start because its side-by-side configuration is incorrect.
をし、イベントログは、この含まれています
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.
:sxstraceを使用して
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.
、私は次の出力を得ました
参照ファイル(Oracle.DataAccess.dll)は、実行可能ファイルの横のプログラム・ディレクトリにあります他のすべての依存関係がありますが、何らかの理由でそれを拾うことはありません。私が以前に使っていた唯一のマニフェストは、うまく動作したexeでのUACチェックでした。私は、パブリッシャーポリシーを無効にする正確なバージョンを指定する手順に従っています。私は何を間違えたのですか?
乾杯
このようなマニフェストは、Windowsサイドバイサイドキャッシュ(c:\ windows \ winsxs)に格納されているアンマネージアセンブリへの依存関係にのみ有効です。 .NET Frameworkは、[AssemblyVersion]を使用して、すでに管理されているアセンブリに対してこれを行います。サイドバイサイドキャッシュはGACです。あなたが解決する必要がある実際の問題は私には分かりません。 –
問題は、GACのパブリッシャーポリシーをバイパスしようとしていることです。このパブリッシャーポリシーは、私たちのアプリケーションでODPの異なるバージョンを使用するように強制しようとします。このポリシーは、私たちのアプリケーションがプログラムディレクトリに存在する参照ライブラリをもはや使用しないことを意味するので、この場合のマニフェストのポイントは、アプリケーションがマニフェストの内容として必要なバージョンを確実に取得したことを確認することでしたGAC内の何かを無効にする。 –
.configファイルで ' を使用して無効にします。 –