将单个 DLL 复制到不同的目录并希望它能正常工作是个坏主意。
一般来说,ODP.NET 提供程序只能与相应的 Oracle 客户端一起使用,即为了使用 ODP.NET 12,您还必须安装 Oracle 客户端 12。同样适用于版本 11 或 10。
唯一的例外是 ODP.NET 托管驱动程序,您只需要一个 DLL (Oracle.ManagedDataAccess.dll)。
此外,架构(32 位与 64 位)必须匹配。
如果您使用 OLEDB 提供程序,甚至不可能安装多个提供程序(对于每个架构) - 除非您一直通过操纵 PATH 变量和注册表来破解您的系统。
我的建议是:从您的计算机上删除所有 Oracle 客户端,然后正确安装 一个(或每个架构一个)Oracle 客户端。一个应用程序不太可能只与一个 Oracle 客户端版本一起工作。在一台机器上同时安装 32 位和 64 位也是一个好方法,请按照以下说明进行操作:Install Oracle x86 and X64 on one machine
如果您确实需要使用不同的 Oracle 客户端版本来测试您的应用程序,请设置几台测试 PC(可能在 Virtual-Box 中),每台都使用不同的客户端版本。否则处理起来会很困难。
更新:
我认为每个(非托管)ODP.NET 版本仅适用于相应版本的 Oracle 客户端。也许偶然有一些组合可以解决,但通常版本应该匹配。
我看到了两种不同的解决方案:
(1) 要求您的客户安装包括 ODP.NET 在内的 Oracle 客户端。他可以选择版本,只有架构(32 位或 64 位)必须匹配。那么您的应用程序不会提供任何 ODP.NET。
在您的*.csproj,分别。 *.vbproj 文件定义你的参考是这样的:
<Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
Version=... 或 processorArchitecture=... 等属性不是必需的。那么您的应用程序应该可以在任何 Oracle/ODP.NET 版本上运行。
您的客户可以从这里下载 ODP.NET 提供程序:Oracle Data Access Components (ODAC) for Windows Downloads 并将其安装在现有的 Oracle 客户端安装之上。在readme.txt 它说“这个 zip 文件的文件不能安装在现有的
基于 Oracle Universal Installer (OUI) 的 Oracle Home 安装。”,但是我看不出有什么不这样做的理由。它运行良好,您只需为现有 Oracle 安装仔细提供正确的文件夹并更正 ORACLE_HOME 名称并执行不安装依赖项。
(2) 在您的安装脚本/exe 中确定客户安装的 Oracle 客户端的版本并根据 ODP.NET 复制到客户机器。
为了确定Oracle客户端的版本,您可以在PATH环境提供的文件夹中搜索文件oci.dll。 oci.dll 是一个普通的 .NET 程序集,因此您可以轻松读出版本。
要正确安装 ODP.NET,请遵循文件 configure.bat,它是下载的 ODP.NET XCopy 版本的一部分。在我看来,这个批处理文件很容易理解。
基本上是这样
1 - 将文件 Oracle.DataAccess.dll 复制到目标机器
2 - 将不同的资源文件*\Oracle.DataAccess.resources.dll 复制到目标机器
3 - 将这些 DLL 添加到 GAC。这可以通过gacutil.exe 或OraProvCfg.exe(包含在下载器 ZIP 文件中)来完成,或者您的设置应用程序提供此操作。
4 - 制作一些注册表条目。较新的 ODP.NET 版本写入/读取到 HKLM\SOFTWARE\Wow6432Node\Oracle\ODP.NET(对于 32 位),分别。 HKLM\SOFTWARE\Oracle\ODP.NET(对于 64 位)。较旧的 ODP.NET 版本使用 HKLM\SOFTWARE\Oracle\KEY_{ORACLE_HOME_KEY}\ODP.NET\(64 位)和 HKLM\SOFTWARE\Wow6432Node\Oracle\KEY_{ORACLE_HOME_KEY}\ODP.NET\(32 位)代替
就是这样,您应该可以将其包含在您的设置中。