【问题标题】:unmanaged c++ dll called from c#, crashes when CString used in dll从 c# 调用的非托管 c++ dll,在 dll 中使用 CString 时崩溃
【发布时间】:2010-02-11 05:43:31
【问题描述】:

你好最优秀的 Stackoverflowians

使用visual studio 2008 Team System,

我有一个具有简单功能的 c++ dll(mfc 静态链接的常规 dll)

extern "C" __declspec(dllexport) int MyExportedFunction( )
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

   CString tempString ;
....
}

从 c# 应用程序到 dll 的 DLLImport 有效,我可以从我的 c# 代码的调试器中进入这个函数 但是(是的,它来了!) 在函数“MyExportedFunction”中,你可以看到我实例化了一个 CString,当这个 CString 实例化被击中时,整个应用程序崩溃 调试器给了我

"无法步进。进程已终止 在尝试另一个附加之前刷新进程列表”

有人对我可以解决这个问题有什么建议吗?

问候 嗡嗡声

【问题讨论】:

  • 编译使用 CString 链接到静态库的托管 C++ 库对我来说是一场噩梦。我不完全记得,但总是有一个链接错误,说 CString 正在使用旧版本并且已经链接了一个新版本。你试过使用 std::string 吗?
  • 将“输出”窗口中的最后几行复制并粘贴到您的帖子中。
  • 程序“[2408] RoadSnappa.exe: Managed”已退出,代码为 -1073741819 (0xc0000005)。程序“[2408] RoadSnappa.exe: Native”已退出,代码为 -1073741819 (0xc0000005)。

标签: c# c++ dll dllimport cstring


【解决方案1】:

MFC 程序定义了一个 CWinApp 对象实例 theApp,它管理新建和删除。

MFC 常规 DLL 定义了自己的 theApp 对象,而 MFC 扩展 DLL 使用另一个模块的“theApp”。

我认为您的崩溃与丢失/未初始化的“theApp”一致。如果是这种情况,内存分配将失败,CString 使用内存分配。

两种可能性:

  • 您从以下位置调用 MFC 扩展 DLL 。网。 (扩展 DLL 不 提供它自己的应用程序)

  • 您调用常规 MFC DLL,其中 theApp 对象未正确初始化。

【讨论】:

  • hmm - 有一个构造函数 CorgarApp::CorgarApp() 并且它被调用 - 我在其中设置了一个断点。虽然它没有正文。 CorgarApp::InitInstance 也被调用了......它只是调用了“CWinApp::Initinstance”,所有这些都是自动生成的代码...... Buzz
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2017-03-07
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多