gpt4 book ai didi

c# - 使用 TCHAR** x[] 参数从 C# 编码到 DLL

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:13 24 4
gpt4 key购买 nike

我正在尝试从某些 C# 调用 Win32 DLL。 DLL函数声明如下:

extern "C" __declspec(dllexport) UINT foo(TCHAR** list[], int& listSize, TCHAR* error);

在 C# 中,我这样声明外部函数:

[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
static extern uint foo(StringBuilder[] list, ref int listSize, StringBuilder error);

我的问题与 list 参数有关,它是一个 StringBuilder 类数组。

我调用DLL函数的部分测试代码如下:(注意:我意识到缺少边界检查等。在这个阶段,我只是想让事情正常进行)。

// allocate a buffer for a possible error message being returned
StringBuilder error = new StringBuilder(1000);

// allocate buffers for the list of strings returned
StringBuilder[] list = new StringBuilder[10];
for (int i = 0; i < 10; i++)
{
list[i] = new StringBuilder(1000);
}

int listSize = list.Length;

uint result = foo(list, ref listSize, error);

将 StringBuilder 作为 error 参数的缓冲区传递,效果很好。我可以在 DLL 中设置它的内容,如下所示:

_tcscpy(error, _T("Something went wrong");

当对 foo 的 C# 调用返回时,字符串错误 变量具有我们在 DLL 中设置的文本。

但是,我不知道如何编码 StringBuilder[] 列表 参数。

在 C++ 中,我可以设置 list 数组的内容:

_tcscpy((*list)[0], _T("First item")); 
// and so on...

而且,即使没有因任何可能的编码问题而发生崩溃,C# 中的 list 在调用 foo() 返回时,确实不包含我们在 C++ 中设置的任何字符串。

我猜问题出在 DllImport 以及我如何声明 list 参数应该被编码。

顺便说一下,示例 DLL 有一个匹配函数,然后可以调用该函数来释放上面显示的示例 foo 返回的“TCHAR** 列表”。

最佳答案

我已经有一段时间没有这样做了,但是您应该尝试以下操作以便正确编码数组 list:

添加一个[MarshalAs(UnmanagedType.LPArray, ArraySubType.LPTStr, SizeParamIndex=1)]list 的属性,您应该添加一个 out,因为数据是在 C++ 代码中分配的。

关于c# - 使用 TCHAR** x[] 参数从 C# 编码到 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14562591/

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