我遇到了一个问题,在使用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);
答案 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;
}