【发布时间】:2020-12-13 22:56:42
【问题描述】:
我正在尝试将一些非托管 ada 代码导入 C# 并使用 Marshal Copy 将其复制到字节数组中,但是我收到了 System.AccessViolationException。你有什么想法为什么会这样。
[DllImport(@"Interpreter.dll", EntryPoint = "ReadErrors", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.AsAny)]
public static extern void ReadErrors(out IntPtr errors);
static IntPtr _errors;
static unsafe void Main(string[] args)
{
ReadErrors(out _errors);
var managedArray = CopyToByteArrayWithMarshalCopy(_errors);
}
static byte[] CopyToByteArrayWithMarshalCopy(IntPtr errors)
{
byte[] managedArray = new byte[Marshal.SizeOf(errors)];
try
{
Marshal.Copy(errors, managedArray, 0, managedArray.Length);
}
catch
{
Marshal.FreeHGlobal(errors);
}
finally
{
Marshal.FreeHGlobal(errors);
}
return managedArray;
}
【问题讨论】:
-
那么
ReadErrors在Ada库中的签名是什么?您实际上要复制什么样的数据?新数组managedArray的初始化长度等于指针errors本身的大小(4 或8 个字节)。这不太可能是正确的。 -
程序读取_Errors_S(错误:Error_T);这是签名,Error_T 是 8 的无符号数组字符
-
但是数组的大小确实不是问题,因为 Marshal 副本只会在指定的长度之前执行此操作。
标签: marshalling ada unmanaged