gpt4 book ai didi

c# - 如何将基于 char** 的数组从基于 C 的 dll 转换为等效的 C#?

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:26 24 4
gpt4 key购买 nike

如何将 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 解决方案。

关于c# - 如何将基于 char** 的数组从基于 C 的 dll 转换为等效的 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17924040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com