AnyCPU 对比 ODP.NET

AnyCPu vs ODP.NET

我的配置:Vs2015 / X64 PC / ODP.NET X86

我已经在 'Any Cpu' 模式下编写了一些 DLL,我想编写使用这些 DLL 并且可以在 X64 和 X86 机器上运行的程序。

但是我在我的 Dll 中引用了 "Oracle.DataAccess.dll" 然后我在 Oracle DLL 上收到警告 'ProcessorArchitecture=X86'。

我该怎么做(如果需要我可以安装ODP.NET X64)?

谢谢

最简单的解决方案是针对 x86 - 64 位操作系统仍然可以加载 运行 32 位应用程序,因此这意味着您的应用程序可以 运行 在两个 x86 上和 x64 机器。

缺点是您的应用程序 必须 运行 作为 32 位进程,即您的进程将有一个 4GB 的最大地址 space 而不能加载 64 位程序集。如果您尝试在 64 位进程中加载​​您的 dll(例如,因为 IIS 尚未配置为使用 32 位应用程序池),您将获得 BadImageFormatException.

如果您不能接受,那么您可以尝试检测流程版本并动态加载正确的程序集as per this Stack Overflow answer

当您使用 "x86" 编译 DLL 时,Oracle.DataAccess.dll 必须 是 x86 版本(即 32 位版本)

当您使用 "x64" 编译 DLL 时,Oracle.DataAccess.dll 必须 是 x64 版本(即 64 位版本)

对于 "AnyCPU" 视情况而定,Oracle.DataAccess.dll 没有 "AnyCPU" 版本。如果您的应用程序 运行s 在 64 位 Windows 上,它将 运行 作为 x64 进程 - 因此 Oracle.DataAccess.dll 也必须是 x64 版本。如果您的应用程序 运行s 在 32 位 Windows 上,它将 运行 作为 x86 进程 - 因此 Oracle.DataAccess.dll 也必须是 x86 版本。

长话短说:Oracle.DataAccess.dll 的体系结构必须与应用程序相同,即您的 DLL。

按照此说明并行进行 运行: BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

更新

在您的 *.csproj 中,相应的。 *.vbproj 像这样编辑你对 ODP.NET 的引用:

<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>

Version=...processorArchitecture=... 等属性不是必需的。您的应用程序将根据所选体系结构和目标 .NET 框架加载正确的 Oracle.DataAccess.dll(前提是安装正确)

上面提到的所有解决方案都是正确的,但我只是觉得有必要提到Oracle.ManagedDataAcces,因为它不关心位数是多少。