.net - OracleConnection 在托管 C++ 中抛出 EEMessageException

标签 .net c++

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

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

错误:

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

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

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

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

………………
'OracleTest.vshost.exe' (Managed): Loaded 'C:\WINDOWS\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'OracleTest.vshost.exe' (Managed): Loaded 'C:\WINDOWS\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'OracleTest.vshost.exe' (Managed): Loaded 'C:\WINDOWS\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
………………

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

'QFeedTest.exe': Loaded 'C:\app\Oracle\bin\oci.dll', Binary was not built with debug information.
First-chance exception at 0x7c812afb in MyUnmanagedCPP.exe: Microsoft C++ exception: EEMessageException at memory location 0x0012d014.


问题:

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

最佳答案

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

关于.net - OracleConnection 在托管 C++ 中抛出 EEMessageException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/895994/

相关文章:

c++ - 为什么 long long 不是 int64_t 但它们具有相同的大小?

c++ - 使用 C++ 和 Jsoncpp 解析 youtube 数据

c# - DataflowBlock.Complete() 据说会阻止 block 产生更多消息,排队的项目会发生什么?

c++ - 替换C++字符串中的标点符号

c# - 如何在 .NET 中以编程方式为图像的透明部分着色

在参数中调用时缺少 Javascript 斜杠

c++ - 在没有模板特化的情况下更改函数的返回类型。 C++

c++ - C++并发调用时如何保证CreateProcess只创建一个进程?

C# 控制台应用程序响应 HTTP POST 请求

asp.net - HttpContext 在 .NET 中的工作原理