2

我知道这里有一些线程被问到相同的主题,但不幸的是没有一个对我有帮助。

我在我的 .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");
4

1 回答 1

2

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

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

于 2012-11-04T05:59:44.237 回答