- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为 P/Invoke 正确编码(marshal)一些结构,但在 64 位操作系统上测试时发现奇怪的行为。
我有一个结构定义为:
/// <summary>http://msdn.microsoft.com/en-us/library/aa366870(v=VS.85).aspx</summary>
[StructLayout(LayoutKind.Sequential)]
private struct MIB_IPNETTABLE
{
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwNumEntries;
public IntPtr table; //MIB_IPNETROW[]
}
现在,为了获取表的地址,我想像这样调用 Marshal.OffsetOf():
IntPtr offset = Marshal.OffsetOf(typeof(MIB_IPNETTABLE), "table");
这应该是 4 - 我已经转储了缓冲区的字节以确认这一点,并在我的指针算法中用硬编码的 4 替换了上面的调用,这产生了正确的结果。
如果我实例化 MIB_IPNETTABLE 并执行以下调用,我确实会得到预期的 4:
IntPtr offset = (IntPtr)Marshal.SizeOf(ipNetTable.dwNumEntries);
现在,在顺序结构中,字段的偏移量应该是前面字段大小的总和,对吗?或者当它是一个非托管结构时,偏移量确实是 8(在 x64 系统上),但只有在 Marshalling 魔术之后才变成 4?有没有办法让 OffsetOf() 调用给我正确的偏移量?我可以使用对 SizeOf() 的调用一瘸一拐地前进,但 OffsetOf() 对于较大的结构来说更简单。
最佳答案
在 64 位 C/C++ 构建中,由于对齐要求,表
字段的偏移量将为 8(除非您强制这样做)。我怀疑 CLR 正在对你做同样的事情:
The members of the object are laid out sequentially, in the order in which they appear when exported to unmanaged memory. The members are laid out according to the packing specified in
StructLayoutAttribute.Pack
, and can be noncontiguous.
如果您需要该级别的控制,您可能希望使用该属性或在每个字段上使用 LayoutKind.Explicit
属性和 FieldOffset
属性。
关于c# - 64 位 P/Invoke 特质,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903510/
我浏览了该网站和其他网站,找不到关于这种特质的任何解释,也找不到任何解决方案。 尽管在这些站点上有各种说法,但是Javascript和HTML5 DOM音频似乎无法在所有浏览器上正常工作,正如在各个站
beginGeneratingDeviceOrientationNotifications是否将状态栏重置回纵向? 在我的应用程序中,在下面记录 o 和 p: UIInterfaceOrientati
我开始意识到这是为初学者准备的: package Bad; has 'arr' => ( is => 'rw', 'ArrayRef[Str]' ); package main; my $bad =
只是想知道如何将的特征与放入vec中?我以为这应该是一个常见的问题,但我从未搜索过答案。 这是代码: use tokio::time::{delay_for, Duration}; #[async_t
更新 我的真正问题是由我的IDE自动导入了use std::borrow::{Borrow, BorrowMut};引起的。 在此行中,接受的答案为also doesn't compile。 解决方案
我正在尝试为 P/Invoke 正确编码(marshal)一些结构,但在 64 位操作系统上测试时发现奇怪的行为。 我有一个结构定义为: /// http://msdn.microsoft.com/e
说我有: abstract class D[T] {} trait A[T] { self => D[T] without B } trait B[T] { self => D[T] without
我尝试使用clap库创建一个简单的应用程序来解析命令行参数,并将其转换为Config自定义结构。我为我的结构实现了From特征,但是,当我尝试调用from函数时,收到以下错误: the trait b
在 Laravel 5.0 中,trait AuthenticatesAndRegistersUsers 中的方法 redirectPath 检查属性 redirectPath 或 redirectT
虽然这个问题有点与语言无关(就支持 Traits 的 OOP 语言而言)我一直在修补 PHP 5.4a 的夜间构建,并遇到了一个奇怪的场景。我似乎无法再运行我的安装,但那是另一回事了。 给定以下代码段
我是一名优秀的程序员,十分优秀!