是否有可能将对象引用重新解释为使用c#代码的本机int ?



免责声明:我知道这是一个不安全的操作和不好的做法,我只是想知道它是否可能。

基本上,我试图将对象引用转换为nint(IntPtr)。它们占用相同大小的内存,所以理论上是可能的。我已经得到它的工作使用DynamicMethod:

DynamicMethod dyn = new DynamicMethod("", typeof(nint), new[] { typeof(object) });
ILGenerator il = dyn.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ret);
Func<object, nint> objectToIntFunction = (Func<object, nint>)dyn.CreateDelegate(typeof(Func<object, nint>));
object obj = new object();
nint asNativeInt = objectToIntFunction(obj);

只使用c#代码可以吗?我没有找到任何适合System.Runtime.CompilerServices.Unsafe的东西。

我也试过这个:

[StructLayout(LayoutKind.Explicit)]
struct Cast
{
[FieldOffset(0)]
public nint Number;
[FieldOffset(0)]
public object Object;
};
Cast cast = new Cast
{
Object = obj
};
nint number = cast.Number;

但是我得到以下错误:

系统。typeloadeexception: '无法加载类型从程序集中'Cast',因为它包含偏移量为0的对象字段,该字段对齐不正确或与非对象字段重叠

我没有找到适合System.Runtime.CompilerServices.Unsafe的东西

object obj = new object();
nint asNativeInt = Unsafe.As<object, nint>(ref obj);

就这样了。

相关内容

最新更新