2016-08-25 1 views
3

C# 응용 프로그램에서 호출 된 관리되는 C++ DLL에서 호출하는 네이티브 C++ DLL이 있습니다.네이티브 C++ 호출에서 마샬링 된 System :: String을 반환 할 때 충돌이 발생합니다.

std::string NativeClass::Test() 
{ 
    return std::string("some string"); 
} 

는 return 문을 실행에, 그러나이

String^ManagedClass::Test() 
{ 
    std::string temp = this->_native->Test(); 
    String^ sRet = msclr::interop::marshal_as<String^>(temp); 

    return sRet; // crashes here !!! 
} 

같이 보입니다 호출 관리되는 C++ 기능, 응용 프로그램 :

는 는

네이티브 DLL의 기능은 다음과 같이 보입니다

Debug Assertion Failed! 
debug_heap.cpp 
Line 980 
Expression: __acrt_first_block == header 

나는 모든 것을 보았다. tackoverflow하지만 아직 해결하지 못했습니다. 어떤 아이디어?

+0

return 문 앞에 문자열 중 하나를 사용하려고하면 어떻게됩니까? 관리되지 않는 문자열의 printf와 관리되는 문자열의 Debug.WriteLine을 추가하고 어떤 일이 발생했는지 알려주십시오. –

+0

비 관리 문자열은 "some string"을 쓰고 관리 문자열은 "some string"을 씁니다. – Jon49

+4

std :: string과 같은 표준 C++ 라이브러리 유형은 종종 하나의 DLL에 할당되고 다른 DLL에서 삭제 될 때 잘못되었습니다. CRT의 정확한 버전이 객체를 만들고 파괴하는 데 사용되는 것이 중요합니다. 정확히 동일한 설정 (마이너스/clr)을 사용하여 정확히 동일한 버전의 컴파일러로 해당 네이티브 DLL을 다시 빌드해야합니다./MD가 필요합니다. –

답변

0

한스가이를 해결했습니다. 실제로 네이티브 DLL과 관리되는 DLL에서 CRT 버전이 일치하지 않았습니다. 나는 이미 이것을 확인했지만 분명히 놓쳤다는 것을 확신했다. 그렇지 않으면 코드는 그대로 작동합니다. 감사.