0

質問は簡単です。マネージ C# コードから私のアンマネージ C++ コードへの文字列を読み取りたいですWCHAR* []。C 関数は次のとおりです。

extern "C"  __declspec(dllexport) int __cdecl myfunc(int argc, WCHAR* argv[])

そしてC#でDLLをインポートしました:

[DllImport("mydll.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
public static extern int myfunc(int argc, [MarshalAs(UnmanagedType.LPTStr)]  StringBuilder str);

実行しましたが、C++ コードで文字列を読み取ろうとすると、AccessViolationException : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

これを行う正しい方法とその逆 (つまり、C++ アンマネージ コードから C# マネージ コードに文字列を渡す方法) は何ですか?

感謝します。ありがとう

4

3 に答える 3

1

あなたの C 関数は文字列の配列を期待しているようですが、代わりに単一の文字列を渡しています。

私は P/Invoke を自分で使用したことはありませんが、この質問は洞察を提供するかもしれません。

于 2011-12-22T12:02:28.623 に答える
0

を使用している場合は、予想の半分のメモリを渡さないように、代わりにWCHAR*マーシャリングを試してみてください。UnmanagedType.LPWStr

文字列のデフォルトのマーシャリングに関するドキュメントに、詳細が記載されているはずです。

于 2011-12-22T13:27:26.870 に答える
0

C#からC ++についてはよくわかりませんが、C ++からC#の問題についてはお手伝いできます。

次のようにC++コードから関数をエクスポートします。

DllExport std::string MyFunction( std::string MyParameter) ;

これは、C#コードに次のようにインポートできます。

 [DllImport("DLLName.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    [return: MarshalAs(UnmanagedType.LPStr)]
    public static extern string MyFunction([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] string MyParameter);

これで、C#コードで、関数" MyFunction"が文字列を受け取り、文字列を返します。その後、MyFunctionを呼び出して、操作を実行できます。

于 2011-12-22T12:24:04.690 に答える