我知道这里有几个线程已被问到有关同一主题,但不幸的是,他们都没有帮助过我。非托管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");
LoadLayoutFile的p/invoke签名是什么样的?此外,应用程序如何崩溃?你得到一个例外或什么? –
@PatrickQuirk签名是 '外部的 “C” 外部INT WINAPI MC_LoadLayoutFile(LPCSTR lpszFileName) { \t CHECK_PROTECT_NOKEY_BOOL; \t return theApp.LoadLayoutFile(lpszFileName); }' 没有例外,只是崩溃,它就消失了! – SVI
您正在使用哪个IDE?在VS中,您可以将调试模式设置为“混合”,以便您可以调试本机代码和托管代码。 – Idov