我的配置:Vs2015 / X64 PC / ODP.NET X86
我已经在“任何 Cpu”模式下编写了一些 DLL,我想编写使用这些 DLL 并且可以在 X64 和 X86 机器上运行的程序。
但是我在我的 Dll 中引用了“Oracle.DataAccess.dll”,然后在 Oracle DLL 上出现警告“ProcessorArchitecture=X86”。
我该怎么办(如果需要,我可以安装 ODP.NET X64)?
谢谢
当您使用“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 框架加载正确的(前提是已正确安装)
最简单的解决方案是以 x86 为目标——64 位操作系统仍然可以加载和运行 32 位应用程序,因此这意味着您的应用程序可以在 x86 和 x64 机器上运行。
缺点是您的应用程序必须作为 32 位进程运行,即您的进程将拥有 4GB 的最大地址空间并且不能加载 64 位程序集。如果您尝试在 64 位进程中加载 dll(例如,因为 IIS 尚未配置为使用 32 位应用程序池),您将获得一个BadImageFormatException
.
如果这对您来说不可接受,那么您可以尝试检测进程版本并根据此 Stack Overflow 答案动态加载正确的程序集
上面提到的所有解决方案都是正确的,但我只是觉得有必要提及 Oracle.ManagedDataAcces,因为它不关心位数是多少。