の文字列を返す私はアンマネージC++をC#から呼び出そうとしていますが、戻り値についての例外を受け取ります。 例外:アンマネージC++ DLLからC#
System.Runtime.InteropServices.MarshalDirectiveException:戻り値 'をマーシャリングすることはできません '':無効な(配列のみLPArray、ByValArray、またはのSafeArrayとしてマーシャリングすることができます)/アンマネージドタイプの組み合わせを管理していました。'
私は問題なく動作する戻り値(void)なしで同じように見える同様の機能を持っています。
C++プロジェクトのプラットフォーム(コンパイラ)をv100(Visual Studio 2010)に設定し、C#プロジェクトで.net 4.5を使用しました。
C++プロジェクトでは、実行可能フォルダにlib + dllファイルを作成しました。
System.AccessViolationException::「保護されたメモリを読み書きしようと、私はC#のコードで「文字列」であることを戻り値を置き換えるしようとすると
、例外があることに変換されます。これはしばしば、他のメモリが壊れていることを示しています。
System.Runtime.InteropServices.MarshalDirectiveException::私は、戻り値関数のプロパティを削除すると
は(
[return: MarshalAs(UnmanagedType.BStr)]
は)私は次の例外を受け取り、戻り値を 『「マーシャリングすることはできません』:無効なは/アンマネージドタイプを管理しました組み合わせ。'
私は、戻り値の関数プロパティを削除し、戻り値の型を文字列に変換すると、アプリケーションは例外をキャッチせずに閉じます。
C++コード
extern "C"
{
ExternalDll_API char* FuncA(char* projectId);
}
ExternalDll_API char* FuncA(char* projectId)
{
return "abc";
}
C#コード
[DllImport("ExternalDll.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern char[] FuncA(string projectId);
var key = FuncA(projectId.ToString());
これは正確な複製ではありません。提案された回答は、1-返された文字列のサイズを知り、StringBuilderを2回渡してC++コードcharポインタを直接返します。 – Gusman