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하지만 아직 해결하지 못했습니다. 어떤 아이디어?
return 문 앞에 문자열 중 하나를 사용하려고하면 어떻게됩니까? 관리되지 않는 문자열의 printf와 관리되는 문자열의 Debug.WriteLine을 추가하고 어떤 일이 발생했는지 알려주십시오. –
비 관리 문자열은 "some string"을 쓰고 관리 문자열은 "some string"을 씁니다. – Jon49
std :: string과 같은 표준 C++ 라이브러리 유형은 종종 하나의 DLL에 할당되고 다른 DLL에서 삭제 될 때 잘못되었습니다. CRT의 정확한 버전이 객체를 만들고 파괴하는 데 사용되는 것이 중요합니다. 정확히 동일한 설정 (마이너스/clr)을 사용하여 정확히 동일한 버전의 컴파일러로 해당 네이티브 DLL을 다시 빌드해야합니다./MD가 필요합니다. –