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

好吧,它不是。此函数采用 char*,一种 8 位字符类型。还不清楚 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 回答