Я знаю, что здесь есть несколько тем на эту тему, но, к сожалению, ни одна из них не помогла мне.
Я использую оболочку для неуправляемого кода 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");
Ваша библиотека выглядит хорошо, может быть, это проблема производительности, у вас может быть большой след стека. Если он не падает, когда вы вызываете его один раз, и происходит, когда вы вызываете его больше, чем это (иногда, как вы сказали), это может быть из-за огромных объектов в памяти, особенно если в вашей библиотеке есть какая-то работа по обработке изображений (я предполагаю, потому что я видел layout
файл), и это не уничтожает их должным образом.
Я советую вам попытаться отделить код вашего настольного приложения от части, которая вызывает эту библиотеку, может быть, вы должны попытаться позволить ей работать в другом потоке или поместить этот сегмент кода в консольное приложение и вызвать это консольное приложение из ваше настольное приложение, которое будет отделять их друг от друга, и если произойдет сбой, это не повлияет на ваше настольное приложение.
Других решений пока нет …