我知道这里有一些线程被问到相同的主题,但不幸的是没有一个对我有帮助。
我在我的 .net 应用程序中使用非托管 c++ 代码的包装器,在非托管 Dll 中有一个函数“ LoadLayoutFile()
”,它加载一个带有扩展名 ( .lyt
) 的自定义格式文件,我的 .net 应用程序有一个循环,它基于调用该函数数组项计数。如果这个数组有一个项目,应用程序运行顺利,没有任何问题,但如果它有多个项目,应用程序立即崩溃,当然,没有任何机会弄清楚发生了什么,但这也不是所有的时间也是,这非常令人困惑。
我尝试了 DebugDiag、Windbg 来跟踪崩溃,但我没有成功。我还尝试通过添加析构函数、异常处理来修复我的非托管代码,我还尝试将垃圾收集器(在 .net 应用程序中)放在它们应该在的位置,但这些都不起作用。我很想知道发生了什么事?或者至少能够捕捉到错误!
这是 C++ dll 中的 LoadLayoutFile():
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;
}
}
添加布局()
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");