【问题标题】:OracleConnection throws EEMessageException in managed C++OracleConnection 在托管 C++ 中引发 EEMessageException
【发布时间】:2015-12-21 18:28:30
【问题描述】:

我有一个本机 C++ 应用程序,它需要连接到 Oracle 数据库。 Oracle 数据层是用 C# 编写的,所以我希望将代码作为 DLL 重用。

我决定尝试使用托管 C++ 来弥合原生 C++ 和 C# 之间的差距。托管 C++ 适配器层工作正常(几乎);非托管 C++ 可执行文件可以毫无问题地调用 C# 代码中的各种类和方法。

错误:

System.Data.OracleClient.OracleConnection除外,这当然是非常重要的部分。

当我在上面调用Open() 时,会抛出EEMessageException。我在 Windows XP 上使用 Oracle 9。

当从 C# exe 调用时,我的 C# 数据对象 dll 工作正常。 因此,我认为将程序集或 oracle 驱动程序加载到在 dll 中托管 CLR 的本机进程中存在某种问题。

这是在普通 C# 应用程序中正常工作的 C# dll。

………………
'OracleTest.vshost.exe'(托管):加载 'C:\WINDOWS\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll',跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。
'OracleTest.vshost.exe'(托管):加载 'C:\WINDOWS\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll',跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。
“OracleTest.vshost.exe”(托管):已加载“C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”,跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。
………………

这里是通过托管 C++ 层调用的原生 C++ 应用程序中的“爆炸式”:

“QFeedTest.exe”:已加载“C:\app\Oracle\bin\oci.dll”,未使用调试信息构建二进制文件。
MyUnmanagedCPP.exe 中 0x7c812afb 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0012d014 处的 EEMessageException。


问题:

我可以做任何项目设置以使其正确加载 Oracle 驱动程序吗?

【问题讨论】:

    标签: .net c++


    【解决方案1】:

    您可以使用Fusion log viewer (fuslogvw.exe) 记录 .Net 尝试加载程序集时发生的情况。另一件事是将您的应用程序作为托管代码而不是本机代码进行调试,然后您应该能够看到实际的托管异常并了解发生了什么。如果由于某种原因无法做到这一点,您可以使用 Windows 调试工具并加载 SOS 扩展 - 这使您可以更轻松地在 WinDBG 中调试 .Net 代码(您也可以在 Visual Studio 中使用 SOS)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多