2012-10-31 2 views
2

여기에 같은 제목에 대해 물어 본 몇 가지 스레드가 있지만 아쉽게도 그 중 일부는 나를 도왔습니다.관리되지 않는 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"); 
+0

'LoadLayoutFile'의 p/invoke 서명은 어떤 모양입니까? 또한 응용 프로그램이 어떻게 충돌합니까? 예외가 생겼나? 뭐라구? –

+0

가 서명 이다 @PatrickQuirk'통근 "C"통근 용 INT WINAPI MC_LoadLayoutFile (LPCSTR lpszFileName) { \t CHECK_PROTECT_NOKEY_BOOL; \t 반환 할 theApp.LoadLayoutFile (lpszFileName); }' 아무런 예외도없고 그냥 충돌, 그냥 사라집니다! – SVI

+0

어떤 IDE를 사용하고 있습니까? VS에서는 디버그 모드를 "혼합"으로 설정하여 원시 코드와 관리 코드를 모두 디버깅 할 수 있습니다. – Idov

답변

2

라이브러리가 정상적으로 보입니다. 성능이 좋을 수도 있습니다. 스택 추적이 큽니다. 한 번 호출 할 때 충돌이 발생하지 않고 그 이상으로 호출 할 때 (때로는 말한 것처럼) 특히 메모리에 거대한 개체가 있기 때문에 라이브러리에 일부 이미지 처리 작업이있을 수 있습니다. 왜냐하면 나는 layout 파일을 보았 기 때문에) 제대로 파괴하지 않습니다.

내 조언은 데스크톱 응용 프로그램 코드를 해당 라이브러리를 호출하는 부분과 분리하려고 시도하는 것입니다. 다른 스레드에서 작동하도록하거나 해당 코드 세그먼트를 콘솔 응용 프로그램에 넣고 호출하려고 시도해야 할 수도 있습니다 데스크톱 응용 프로그램에서 콘솔 응용 프로그램을 실행하면 서로 분리 할 수 ​​있으며 충돌이 발생할 경우 데스크톱 응용 프로그램에 영향을 미치지 않습니다.

+0

감사합니다. – SVI

관련 문제