无法加载文件或程序集'Oracle.DataAccess, Version=4.112.4.0, Culture=neutral, PublicKeyToken=89b483f429c47342'。

5
我在服务器上安装了Oracle 11g r2,并下载了ODAC112040Xcopy_64bit并安装了.net组件。
我将位于Oracle_Folder\odp.net\bin\4位置的Oracle.DataAccess.dll复制到Visual Studio项目内的bin文件夹中。
当我执行代码时,出现了以下异常:
未处理的System.BadImageFormatException类型异常发生于TestOracleConnection.exe中。
附加信息:无法加载文件或程序集“Oracle.DataAccess,Version=4.112.4.0,Culture=neutral,PublicKeyToken=89b483f429c47342”或其依赖项之一。尝试加载格式不正确的程序。
我的代码如下:
public string CallCardDetails(string CallCardNo)
{
    //initialize
    using (DataSet ds = new DataSet())
    {
        //connect
        using (OracleConnection conn = new OracleConnection("User Id=oraDB;Password=ora;Data Source=CCT"))
        {
            // Oracle uses : for parameters, not @
            string query = "SELECT idcard from CallCardTable where idcard= :pCallCardNo";

            // Let the using block dispose of your OracleCommand
            using (OracleCommand cmd = new OracleCommand(query, conn))
            {
                // Note: be careful with AddWithValue: if there's a mismatch between the .NET datatype of
                // CallCardNo and the idcard column you could have an issue.  Cast the value you provide
                // here to whatever is closest to your database type (String for VARCHAR2, DateTime for DATE, Decimal for NUMBER, etc.)
                cmd.Parameters.Add(":pCallCardNo", CallCardNo);
                conn.Open();

                // Again, wrap disposables in a using or use try/catch/finally (using will dispose of things in case of exceptions too)
                using (OracleDataAdapter dA = new OracleDataAdapter(cmd))
                {
                    dA.Fill(ds);

                    return ds.GetXml();
                }
            }
        }
    }
}

你的项目使用的是哪个 .NET 版本? - Syed Osama Maruf
@SyedOsamaMaruf,它是4.5,“目标框架(Target Framework)”就是你要找的吗? - Marco Dinatsoli
是的。您发布的文件位置显示您从Oracle_Folder\odp.net\bin\4中获取了它,这是4版本的bin文件夹。请查看bin\4.5中是否有所需的dll,那可能是您需要的。 - Syed Osama Maruf
@SyedOsamaMaruf,不,只有24(以及Oracle 11.1之前的1.x)。针对目标框架4.5的应用程序将使用4 - Wernfried Domscheit
@Wernfried 谢谢。我不知道那个。 - Syed Osama Maruf
6个回答

8

根据我使用ODP.NET的经验,我建议以下操作:

你的系统试图加载64位Oracle DLL,但无法加载,因为应用程序正在以32位模式运行。尝试将应用程序明确设置为64位。或者,安装32位ODP.Net驱动程序,看看是否有更好的效果。


3

我之前遇到了类似的问题...... 参考这个问题:

尝试将项目的“平台目标”设置为“x86”,而不是“任何 CPU”。

希望能对你有所帮助!


1
我已经这样做了,但仍然存在完全相同的问题。 - Marco Dinatsoli
3
一款x86应用程序无法加载已安装的64位ODP.NET提供程序。 - Wernfried Domscheit
1
这解决了我在一个我正在开发的古老应用程序中遇到的问题。我早该知道啊!谢谢! - adprocas

2
这是我的解决方法:

安装包 ODP.NET4 -版本 4.112.3


1
检查dll的目标框架和您的项目是否匹配。您发布的文件位置显示您从Oracle_Folder\odp.net\bin\4版本的bin文件夹中获取了它。查看bin\4.5中是否有所需的dll,这可能是您需要的内容。如果将目标框架与您的项目不匹配的dll添加到项目中,也会出现此异常。在将dll放置在bin文件夹之前,还要清理解决方案。 :)

我已将项目框架更改为“4”,但仍然遇到完全相同的问题。 - Marco Dinatsoli
请从http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html下载ODP.NET_Managed121020.zip - 2.53 MB(2,662,823字节),然后从中使用odp.net/managed/common/Oracle.ManagedDataAccess.dll。@Marco Dinatsoli - Syed Osama Maruf
同时不要手动将dll放置在bin文件夹中。在项目中添加它的引用,并确保复制本地属性设置为true。重新构建项目并运行。 - Syed Osama Maruf

1
我通常使用NuGet包来使用ODP.net,它们运行良好。您可以在这里找到它们。
这是构建解决方案所需的全部内容,您不需要安装任何驱动程序。

0
为了使用Oracle Data Prover for .NET (ODP.NET) Version 4.112.4.0 64位,必须满足以下条件:
  • 目标框架为4.0或更高版本
  • 架构必须是x64AnyCPU(在64位Windows的情况下,这是最可能的情况)
  • 64位Oracle客户端版本11.2已安装在您的PC和目标机器上

在此答案中查找更多信息:提供程序与Oracle客户端版本不兼容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接