2016-08-25 40 views
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 

次のようなエラーでクラッシュします。私はそれをまだ解決していない。何か案は?

+0

return文の前にどちらかの文字列を使用しようとするとどうなりますか?管理されていない文字列のprintfと管理された文字列のDebug.WriteLineを追加して、何が起こるか教えてください。 –

+0

管理されていない文字列は "some string"を書き出し、マネージ文字列は "some string"を書き出します – Jon49

+4

std :: stringのような標準的なC++ライブラリタイプは、1つのDLLに割り当てられて別のDLLで破棄されると、オブジェクトを作成して破壊するには、CRTと全く同じバージョンを使用することが重要です。正確な同じ設定(マイナス/ clr)を使用して同じバージョンのコンパイラでネイティブDLLを再構築してください。/ MDが必要です。 –

答えて

0

ハンスがこれを解決するのを助けました。実際には、ネイティブdllとマネージdllのCRTバージョンの間には不一致がありました。私はすでにこれをチェックしていたが、明らかにそれを逃したと確信していた。そうでなければ、コードはそのまま動作します。ありがとう。

関連する問題