1

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

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

但是我在我的 Dll 中引用了“Oracle.DataAccess.dll”,然后在 Oracle DLL 上出现警告“ProcessorArchitecture=X86”。

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

谢谢

4

3 回答 3

1

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

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

对于“AnyCPU”,这取决于,没有“AnyCPU”版本的Oracle.DataAccess.dll. 如果您的应用程序在 64 位 Windows 上运行,它将作为 x64 进程运行 - 因此也Oracle.DataAccess.dll必须是 x64 版本。如果您的应用程序在 32 位 Windows 上运行,它将作为 x86 进程运行 - 因此也Oracle.DataAccess.dll必须是 x86 版本。

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

按照此说明并行运行两者: BadImageFormatException。这将在安装了 32 位 Oracle 客户端组件的 64 位模式下运行时发生

更新

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

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

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

于 2017-05-15T17:14:09.020 回答
0

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

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

如果这对您来说不可接受,那么您可以尝试检测进程版本并根据此 Stack Overflow 答案动态加载正确的程序集

于 2017-05-15T16:19:08.587 回答
0

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

于 2017-10-17T16:09:04.533 回答