在我们的应用程序中实现 ODP.Net 的使用时,我遇到了版本的潜在问题,所以我敲开了一个快速测试应用程序,看看它是否会影响我们,确实如此。
我们有客户在 Oracle 上拥有或想要我们的应用程序,但他们使用不同的版本,并且他们通常在其工作站上部署的 Oracle 客户端版本具有企业标准。我们的想法是使用我们的应用程序(在程序目录中)部署一个固定版本的 ODP 以及适当的即时客户端,因为 Oracle 保证任何给定客户端版本的任何一方都具有 2 个主要版本的兼容性,这意味着我们可以使用,比如 Oracle通过使用部署 ODP 和客户端 11.1,从 10.1 到理论上的 Oracle 12。
这很好,但是如果我们的客户随后部署更高版本的 Oracle 客户端,该客户端在 GAC 中注册更新版本的 ODP 以及告诉应用程序无论如何都使用新版本的发布者策略,那么问题就来了。我们正在使用来自 EntlibContrib(ODP 包装器)的一个库的自定义实现,该库使用我们使用的特定版本的 EL5 和 ODP 构建,并且将更新版本部署到 GAC 会导致此失败,正如测试应用程序所证明的那样。
为了测试这一点,我使用了一个安装了 Win 7 x86 的干净 VM,然后添加了 Oracle Client 10.2(它在 GAC 中注册了 ODP 10.2)并让我的测试应用程序使用 ODP 和 Client 11.1。这工作得很好,所以我安装了客户端 11.2,在 GAC 中注册了 ODP,它也添加了发布者策略,这证明测试应用程序会失败。
为了解决这个问题,我向 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 检查,据我所知,我已按照步骤指定应该覆盖发布者策略的确切版本。我做错了什么?
干杯