【问题标题】:Why does x64 console app can refer 32 bit Oracle.DataAccess.dll without any exception为什么 x64 控制台应用程序可以毫无例外地引用 32 位 Oracle.DataAccess.dll
【发布时间】:2019-08-04 07:15:16
【问题描述】:

这是一个更新 Oracle 数据库的控制台应用程序。它指的是 32 位的 Oracle.DataAccess.dll。这是数据库操作的核心代码。

            using (OracleConnection connection = new OracleConnection(DataSource))
            {
                using (OracleCommand cmd = new OracleCommand())
                {
                    try
                    {
                        cmd.CommandText = paraText;
                        cmd.CommandType = CommandType.Text;
                        cmd.Connection = connection;
                        cmd.Connection.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        FileLog.Error("UpdateActiveStatus", ex, LogType.Error);
                    }
                    finally
                    {
                        cmd.Connection.Close();
                        cmd.Connection.Dispose();
                    }
                }
            }

我将控制台应用程序平台目标设置为 x64,而 oracle dll 为 32 位。但它有效!为什么?在我看来,x64 应用程序不能引用 x86 dll。

为了确保应用程序在 x64 下运行,我转到任务管理器并发现控制台应用程序进程确实处于 x64 模式。

为什么?带有 32 位 dll 的 x64 控制台应用程序,没有任何格式错误的 dll 异常?

编辑:这里是关于版本的更多信息。

这就是控制台应用程序的设置方式。

这是它引用的 oracle dll。

这是 oracle dll 版本检测。

编辑: 我得到的结论是它现在从 GAC 中找到了这个 x64 dll。但是它怎么知道它应该使用哪个版本呢?我的本地机器上安装了不同的 oracle 客户端。

【问题讨论】:

  • 您确定您有 32 位 Oracle DLL 吗?检查Sigcheck
  • @wernfried-domscheit,当然。我更新了一些信息。这可以确认这是一个 32 位的 oracle dll。
  • 检查 Process Monitor 实际加载了哪个 DLL。也许它是从优先于本地文件的 GAC 加载的。
  • 嗨@wernfried-domscheit,还有其他工具可以检测它实际加载的dll吗?由于公司计算机的政策,Process Monitor 无法在我的计算机上启动。
  • 嗨@wernfried-domscheit,我终于找到了答案。我在日志文件中记录了 typeof(OracleConnection).Assembly.Location。结果是 C:\Windows\assembly\GAC_64\Oracle.DataAccess\2.112.3.0__89b483f429c47342\Oracle.DataAccess.dll

标签: c# oracle


【解决方案1】:

强名称组装,首先搜索的是GAC,然后是bin文件夹。

【讨论】:

    【解决方案2】:

    我终于找到了根本原因。

    控制台应用程序没有使用 x86 版本的 oracle dll,而是使用 GAC 中的那个!

    这就是我发现这一点的方法。如果我们不确定我们从哪个dll中获取类,我们可以使用typeof(OracleConnection).Assembly.Location来获取真正加载的程序集的位置,即该类所在的位置。这里我发现它是C:\Windows\assembly\GAC_64\ Oracle.DataAccess\2.112.3.0__89b483f429c47342\Oracle.DataAccess.dll !

    综上所述,x64 控制台应用程序如何使用 oracle dll。对于所有强名称程序集都是如此。

    1. 它将检查 GAC。如果找到正确的,就会使用它。
    2. 如果在 GAC 中没有找到正确的 oracle dll,它将搜索 app bin 文件夹..

    【讨论】:

    猜你喜欢
    • 2014-01-21
    • 2010-11-07
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多