我是.Net的新手。我创建了一个连接到数据库并执行一些事务的代码。对于数据访问管理器,我添加了引用 Oracle.DataAccess.86 (Oracle.DataAccess.dll) 并在本地使用"任何 CPU"运行。它工作正常。但是当我在运行 64 位 IIS 的服务器上部署它时,它会给我以下错误:
无法加载文件或程序集"Oracle.DataAccess"或其依赖项之一。尝试加载格式不正确的程序。 说明:执行当前 Web 请求期间发生未经处理的异常。请查看堆栈跟踪,了解有关错误及其在代码中起源位置的详细信息。
异常详细信息:System.BadImageFormatException:无法加载文件或程序集"Oracle.DataAccess"或其依赖项之一。尝试加载格式不正确的程序。
[BadImageFormatException:无法加载文件或程序集"Oracle.DataAccess"或其依赖项之一。尝试加载格式不正确的程序。 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence AssemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +225 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +110 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +22 System.Reflection.Assembly.Load(String assemblyString) +34 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +48
如何找到此错误的解决方案?
您的问题是错误的Oracle DLL加载到内存中
如果将程序集构建为 AnyCPU...
要求以 x64 身份运行- 已安装 Oracle Client x64,部署 Oracle.DataAccess.dll部署 x64,AppPool set"run 32 bit" = false
。
要求以 x86 身份运行- 已安装 Oracle Client x86,部署 Oracle.DataAccess.dll部署 x86,AppPool set"run 32 bit" = true
。
但是你为什么要在2019年使用Oracle.DataAccess.dll
呢?使用Oracle.ManagedDataAccess.dll
.安装一小组连接组件(ODAC),不需要Oracle客户端x64/x86 - 所有这些都将作为AnyCPU完成。更好的是,为Visual Studio安装Oracle开发工具,其中包括ODAC。
如果 IIS 是 64 位,那么您还需要 64 位版本的Oracle.DataAccess.dll
。我假设您的服务器上根本没有安装Oracle.DataAccess,请验证安装是否正确。请注意,Oracle.DataAccess.dll
需要一个 Oracle 客户端(通常是 Oracle 实例客户端),这也必须与Oracle.DataAccess.dll
相同的体系结构。
对Oracle.DataAccess.dll的引用是相同的。应用程序(在您的情况下为 IIS)将自动加载正确的程序集 - 前提是它在计算机上已安装且可用。您可以删除项目文件中的processorArchitecture=x86
属性,也可以编辑*.csproj
、 和 。 使用文本编辑器手动*.vbproj
文件。