3
C#アプリケーションから呼び出されたマネージC++ dllから呼び出すネイティブC++ dllがあります。ネイティブC++呼び出しからマーシャリングされたSystem :: Stringを返すときにクラッシュする
ネイティブDLL内の関数は次のようなものになります。
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++の関数を
Debug Assertion Failed!
debug_heap.cpp
Line 980
Expression: __acrt_first_block == header
次のようなエラーでクラッシュします。私はそれをまだ解決していない。何か案は?
return文の前にどちらかの文字列を使用しようとするとどうなりますか?管理されていない文字列のprintfと管理された文字列のDebug.WriteLineを追加して、何が起こるか教えてください。 –
管理されていない文字列は "some string"を書き出し、マネージ文字列は "some string"を書き出します – Jon49
std :: stringのような標準的なC++ライブラリタイプは、1つのDLLに割り当てられて別のDLLで破棄されると、オブジェクトを作成して破壊するには、CRTと全く同じバージョンを使用することが重要です。正確な同じ設定(マイナス/ clr)を使用して同じバージョンのコンパイラでネイティブDLLを再構築してください。/ MDが必要です。 –