2012-10-31 91 views
2

我知道这里有几个线程已被问到有关同一主题,但不幸的是,他们都没有帮助过我。非托管C++代码导致崩溃到.Net应用程序

我使用非托管C++代码在我的.NET应用程序,在非托管的DLL有一个功能“LoadLayoutFile()”,其中,它加载与扩展(.lyt)的自定义格式文件的包装,我的.NET应用程序有一个循环,它会根据数组项数量调用该函数。如果这个数组有一个项目,应用程序运行顺利没有任何问题,但是如果它有多个项目,应用程序会立即崩溃,当然没有任何机会找出发生的事情,但这也不会发生所有时间也是这样,这非常混乱。

我试过DebugDiag,Windbg来跟踪崩溃,但我没有成功。 我也试图通过添加析构函数,异常处理来修复我的非托管代码,我也尝试将垃圾收集器(在.net应用程序中)放在应该在的位置,但这些都不起作用。我很想知道发生了什么事?或者至少能够发现错误!

这里的LoadLayoutFile()在C++ DLL:

int CMKCRD32App::LoadLayoutFile(LPCSTR lpszFileName) 
{ 
    try 
    { 
     int  nRetVal = MCRC_SUCCESS; 
     CFile file; 
     WORD wVersionNumber; 

     // Add New Layout to the Layouts List 
     nRetVal = AddLayout(); 

     // If Layout not added Correctly return Error Code 
     if(nRetVal<0) 
      return MCRC_MAXLAYOUT_REACHED; 

     if(file.Open(lpszFileName,CFile::modeRead|CFile::shareCompat)) 
     { 
      CArchive ar(&file,CArchive::load); 

      ar >> wVersionNumber; 

      m_pCard[nRetVal]->Serialize(ar,wVersionNumber); 

      ar.Close(); 
      file.Close(); 

      m_pCard[nRetVal]->OffsetItemsByMargin(TRUE); 
     } 
     else 
     { 
      nRetVal = MCRC_ERROROPENFILE; 
     } 

     return nRetVal; 
    } 
    catch(char *str) 
    { 
     throw str; 
    } 
} 

的AddLayout()

int CMKCRD32App::AddLayout() 
{ 
    int nIndex; 
    try 
    { 
     for(nIndex=(_MAX_LAYOUTS_-1); nIndex >= 0; nIndex--) 
      if(m_pCard[nIndex]==NULL) 
       break; 

     if(nIndex>=0) 
     { 
      m_pCard[nIndex] = new CLYT_Card(); 

      if(!m_pCard[nIndex]) 
      { 
       nIndex = -1; 
      } 
     } 

     return nIndex; 
    } 
    catch(char *str) 
    { 
     throw str; 
    } 

} 

而这里正是它在.NET应用程序崩溃(有时):

CardLayout cardLayout = new CardLayout(); // Wrapper 

foreach(var item in x) 
    int layout = cardLayout.LoadLayoutFile("cc.lyt"); 
+0

LoadLayoutFile的p/invoke签名是什么样的?此外,应用程序如何崩溃?你得到一个例外或什么? –

+0

@PatrickQuirk签名是 '外部的 “C” 外部INT WINAPI MC_LoadLayoutFile(LPCSTR lpszFileName) { \t CHECK_PROTECT_NOKEY_BOOL; \t return theApp.LoadLayoutFile(lpszFileName); }' 没有例外,只是崩溃,它就消失了! – SVI

+0

您正在使用哪个IDE?在VS中,您可以将调试模式设置为“混合”,以便您可以调试本机代码和托管代码。 – Idov

回答

2

你的库看起来很好,可能是性能方面的问题,你可能会有一个大的堆栈跟踪。如果它在你调用一次的时候没有崩溃,并且当你调用它的时候它确实会崩溃(有时候就像你说的那样),这可能是因为内存中的巨大对象,特别是如果你的库有一些图像处理工作要做(我假设因为我看过layout文件)并且它不会正确销毁它们。

我给你的建议是尝试将桌面应用程序代码与调用该库的部分分开,可能应该尝试让它在另一个线程上工作或尝试将该代码段放入控制台应用程序中并调用该控制台应用程序将从桌面应用程序中分离出来,如果发生任何崩溃,则不会影响桌面应用程序。

+0

谢谢,我认为这样做 – SVI