编组字符串数组的合适方法是什么?

时间:2012-02-09 21:35:19

标签: c#

我遇到了一个问题,在使用ReSharper进行调试时,我得到了不同的内存布局。

我有一个非托管方法,它返回一个(最多)7个字符,以null结尾的字符串数组。在没有ReSharper调试器的情况下执行此方法时,“next”字符串的开头是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);

1 个答案:

答案 0 :(得分:2)

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

[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;
}