gpt4 book ai didi

c# - 编码字符串数组的合适方法是什么?

转载 作者:行者123 更新时间:2023-11-30 17:13:57 25 4
gpt4 key购买 nike

我在使用 ReSharper 调试时遇到不同的内存布局问题。

我有一个非托管方法,它返回一个(最多)7 个字符、以 null 结尾的字符串数组。在没有 ReSharper 调试器的情况下执行此方法时,“下一个”字符串的开头在 16 个字节后。当使用 ReSharper 的调试器执行它时(通过 ReSharper 的单元测试表单选择“调试单元测试”选项),开始是 64 字节后。

方法签名类似于下面的代码片段。然后“创建”字符串数组,类似于解决方案 here .

[return: MarshalAs(UnmanagedType.I1)]
[DllImport("myDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern bool GetStrings(IntPtr sourceFile,
out IntPtr ptrToStrings,
out uint numberOfStrings);

最佳答案

尝试使用它来获取字符串:

[return: MarshalAs(UnmanagedType.I1)]
[DllImport("myDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static unsafe extern bool GetStrings(IntPtr sourceFile,
[Out] out byte* ptrToStrings,
[Out] out uint numberOfStrings);


[SecuritySafeCritical]
private static unsafe string[] ManagedMethod(IntPtr sourceFile)
{
uint size;
byte* array;
if (!GetStrings(sourceFile, out array, out size))
{
throw new Exception("Unable to read strings.");
}

string[] retval = new string[size];
for (int i = 0, p = 0; i < size; i++, p += 8)
{
retval[i] = Marshal.PtrToStringAnsi(new IntPtr(&array[p]));
}

return retval;
}

关于c# - 编码字符串数组的合适方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219169/

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