2017-09-27 45 views
-2

の文字列を返す私はアンマネージ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()); 
+0

var result = FuncA(someString); var strResult = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(result); 
https://stackoverflow.com/questions/10799685/how-to-pass-strings-from-c-sharp-to-c-and -from-c-to-c-using-dllimport –

+0

これは正確な複製ではありません。提案された回答は、1-返された文字列のサイズを知り、StringBuilderを2回渡してC++コードcharポインタを直接返します。 – Gusman

答えて

1

あなたがこれを行うことができますdllをC++から終了された文字列はnullを受信するには:

1-変更IntPtrに戻り値の型を:

[DllImport("ExternalDll.dll")] 
public static extern IntPtr FuncA(string projectId); 

マーシャル使用ポインタから文字列を2取得:

関連する問題