如何将 C 中基于 char**
的数组转换为 C# 中的等效类型?
我有一个 DLL,它有一个函数,它接受一个 char**
缓冲区并用正确的数据填充它。
我在 C# 应用程序中使用此 DLL,方法是使用 DllImport
当我需要为此类函数指定返回类型
或参数类型
时,问题就出现了。
C# 中的哪种类型等同于 C char**
数组?
我应该编码什么以及如何编码?
更新:
这是我的 C 函数,它位于我的 dll 中:
CDLL_API wchar_t** GetResults(wchar_t* word, int* length, int threshold = 9);
这两个函数调用下面的函数来获取它们的值:
wchar_t** xGramManipulator::CGetNextWordsList(const wchar_t* currentWord, int threshold)
{
wstring str(currentWord);
auto result = GetNextWordsList(str, threshold);
return GetCConvertedString(result);
}
wchar_t ** xGramManipulator::GetCConvertedString(vector< wstring> const &input)
{
DisposeBuffers();//deallocates the previously allocated cStringArrayBuffer.
cStringArraybuffer = new wchar_t*[input.size()];
for (int i = 0; i < input.size(); i++)
{
cStringArraybuffer[i] = new wchar_t[input[i].size()+1];
wcscpy_s(cStringArraybuffer[i], input[i].size() + 1, input[i].c_str());
cStringArraySize++;
}
return cStringArraybuffer;
}
我使用了 wchar_T** 但我认为 C# 方面应该没有任何区别(因为 c# 默认支持 unicode!所以如果它不同请也解决这个问题)
在评论中您声明您对处理此功能最感兴趣:
CDLL_API wchar_t** GetResults(wchar_t* word, int threshold);
您不能期望 p/invoke 编码器为您编码返回值。您需要手动执行此操作。更重要的是,您无法可靠地调用当前设计的函数。那是因为调用者无法获得返回数组的长度。您需要添加一个额外的参数以将数组长度返回给调用者:
CDLL_API wchar_t** GetResults(wchar_t* word, int threshold, int* len);
在 C# 端,您可以这样声明它:
[DllImport(@"DllName.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr GetResults(
[MarshalAs(UnmanagedType.LPWStr)]
string word,
int threshold,
out int len
);
并且您需要确保您在 DllImport
中指定的调用约定与 native 代码的调用约定相匹配。我假设 cdecl
,但只有您确定。
这样调用它:
int len;
IntPtr results = GetResults(word, threshold, out len);
IntPtr[] ptrs = new IntPtr[len];
Marshal.Copy(results, ptrs, 0, len);
for (int i=0; i<len; i++)
{
string item = Marshal.PtrToStringUni(ptrs[i]);
}
为避免内存泄漏,您需要导出另一个函数来释放 GetResults
分配的内存。完成调用 PtrToStringUni
后调用它。
坦率地说,这看起来非常适合混合模式 C++/CLI 解决方案。
我是一名优秀的程序员,十分优秀!