gpt4 book ai didi

c# - 如何使用 C# 获取 char**?

转载 作者:可可西里 更新时间:2023-11-01 08:47:40 27 4
gpt4 key购买 nike

<分区>

我需要以以下形式将参数传递给不安全的 DllImported 函数:

[DllImport("third_party.dll")]
private static extern unsafe int start(int argc, char** argv);

我假设它是一个字符串数组。但是,当我尝试执行以下操作时,出现“无法从字符串 [] 转换为 char**”错误。我该如何着手让它发挥作用?谢谢。

string[] argv = new string[] { };
start(0, argv);

编辑 1:该问题被标记为重复,但查看可能重复的问题,我仍然不知道如何让它工作。

编辑 2:进一步阐明问题和所需参数。它看起来像您的标准 argc/argv 参数(参数计数,然后是参数值)。与启动 c 程序的方式相同:int main(int argc, char** argv); 对于这个特定问题,我根本不想传递任何参数(因此计数为 0) .

编辑 3:我从第 3 方库供应商处获得了更多信息。在这里:

  • 第一个参数是参数的个数
  • 第二个参数是一个以null结尾的字符串数组
  • 字符串是 ANSI 编码的

EDIT 4:使用可行的解决方案进行最终编辑(至少就我而言)。我会把它作为答案,但不能因为这个问题被标记为重复。这是一个 link一个对我帮助最大的问题。最后,dll 函数需要一个指向带有 ANSI 字符串的缓冲区的指针数组。所以我的 final方法(基于链接的问题)如下所示。在内存中创建一个数组来保存指针,然后在内存中的其他地方分配每个字符串,并将指针写入第一个指针数组中的那些字符串。此代码在生产中有效:

[DllImport("third_party.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern int start(Int32 args, IntPtr argv);

public bool start(params string[] arguments)
{
int result;

if (arguments == null || arguments.Length == 0)
{
result = dll_system_startup(0, IntPtr.Zero);
}
else
{
List<IntPtr> allocatedMemory = new List<IntPtr>();

int sizeOfIntPtr = Marshal.SizeOf(typeof(IntPtr));
IntPtr pointersToArguments = Marshal.AllocHGlobal(sizeOfIntPtr * arguments.Length);

for (int i = 0; i < arguments.Length; ++i)
{
IntPtr pointerToArgument = Marshal.StringToHGlobalAnsi(arguments[i]);
allocatedMemory.Add(pointerToArgument);
Marshal.WriteIntPtr(pointersToArguments, i * sizeOfIntPtr, pointerToArgument);
}

result = start(arguments.Length, pointersToArguments);

Marshal.FreeHGlobal(pointersToArguments);

foreach (IntPtr pointer in allocatedMemory)
{
Marshal.FreeHGlobal(pointer);
}
}

return result == 0;
}

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