여기에 같은 제목에 대해 물어 본 몇 가지 스레드가 있지만 아쉽게도 그 중 일부는 나를 도왔습니다.관리되지 않는 C++ 코드로 인해 .Net 응용 프로그램에 충돌이 발생합니다.
내 .net 응용 프로그램에서 관리되지 않는 C++ 코드의 래퍼를 사용하고 있습니다. 관리되지 않는 Dll에는 확장명이 (.lyt
) 인 사용자 정의 형식의 파일을로드하는 "LoadLayoutFile()
"함수가 있는데, 내 .net 응용 프로그램에는 루프가 있습니다. 배열 항목 개수에 따라 함수를 호출합니다. 이 배열에 하나의 항목이 있으면 응용 프로그램이 문제없이 원활하게 실행되지만 항목이 두 개 이상이면 응용 프로그램이 즉시 충돌이 발생하지 않고 어떤 일이 발생했는지 파악할 수 있지만 모든 문제가 발생하지는 않습니다. 또한 매우 혼란 스럽습니다.
충돌을 추적하기 위해 DebugDiag, Windbg를 시도했지만 성공하지 못했습니다. 소멸자, 예외 처리를 추가하여 내 관리되지 않는 코드를 수정하려고했습니다. 가비지 컬렉터를 .net 응용 프로그램에 넣으려고했습니다. 나는 무슨 일이 일어나고 있는지 알고 싶습니까? 또는 적어도 오류를 잡을 수 있어야합니다!
가 여기에 C에서 LoadLayoutFile을()의 ++ 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() (때로는)는 .NET 응용 프로그램에서 충돌이 정확히 여기
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;
}
}
그리고 :
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 반환 할 theApp.LoadLayoutFile (lpszFileName); }' 아무런 예외도없고 그냥 충돌, 그냥 사라집니다! – SVI
어떤 IDE를 사용하고 있습니까? VS에서는 디버그 모드를 "혼합"으로 설정하여 원시 코드와 관리 코드를 모두 디버깅 할 수 있습니다. – Idov