0

【C/C++コード】

extern "C" __declspec(dllexport) int Analyze_input_text(char* input_text, char *ppArray){
   int size;
   // code...
   return size;
}

【C#コード】

[DllImport("PP_TextAnalyzer.dll",CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
extern public static int Analyze_input_text(IntPtr data, [MarshalAs(UnmanagedType.LPArray, SizeConst = 100)]  string[] ppArray);

public int GetResultData(string input_text)
{
    IntPtr pStr = Marshal.StringToCoTaskMemUni(input_text);
    List<string> ppArray = new List<string>();
    int size = **Analyze_input_text(pStr,ppArray.ToArray());** //Array(List) is still null.
    return size;
}

もうこの問題を解決する方法がわかりません...

誰か助けて?

4

1 に答える 1

2

CharSet=CharSet.Unicode

そうではありません。この関数は、8 ビットの文字型である char* を取ります。また、どのように ppArray が文字列の配列になるか、つまり char** になるかどうかも不明です。宣言されているように、適切な pinvoke 宣言は次のとおりです。

[DllImport("PP_TextAnalyzer.dll", CallingConvention = CallingConvention.Cdecl, 
              CharSet=CharSet.Ansi)]
extern public static int Analyze_input_text(string data, string ppArray);

本当に文字列の配列を渡すつもりなら、C 関数を少なくとも次のように変更する必要があります。

extern "C" __declspec(dllexport) 
int Analyze_input_text(char* input_text, char** ppArray, int arraySize)

そして、C# コードで ppArray 引数を string[] として宣言します。C コードでは Unicode、wchar_t* を使用する必要があることに注意してください。Unicode からローカルの 8 ビット システム コード ページに変換されたテキストを "分析" しようとすることは、最初から不可解な命題です。そしてもちろん、このコードを C# で記述したときに、このコードがまだ十分に高速で損失が少ないことを確認してください。.NET は Unicode をかなり適切にサポートしています。

于 2013-04-14T12:40:16.160 に答える