Csharp/C#教程:Getfield.SetValue不起作用分享


Getfield.SetValue不起作用

在我的项目中我正在努力我偶然发现了这个问题:

我想创建一个类“ApiID”的实例。 我从Reflector获得了代码,因为你可以看到.dll(不是我的Project)导入来自ummanaged代码,我无权访问。

[StructLayout(LayoutKind.Sequential, Size=0x10), CLSCompliant(false), NativeCppClass, DebugInfoInPDB, MiscellaneousBits(0x40)] public struct ApiId { private long ; public static unsafe void (ApiId* idPtr1, ApiId* idPtr2) { ApiId.{ctor}(idPtr1, (ApiId modopt(IsConst)* modopt(IsImplicitlyDereferenced)) idPtr2); } public static unsafe void (ApiId* idPtr1) { ApiId.{dtor}(idPtr1); } } 

我的C#-Code看起来像这样:

 var _apiId = new ApiId(); long vlue = 0x0000000041403070; typeof(ApiId).GetField("", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(_apiId, vlue); 

该代码成功运行,但是Field不会改变并保持0 …我做错了什么? 问候

这里的问题是拳击

这一行:

 typeof(ApiId).GetField("", ...).SetValue(_apiId, vlue); 

将在_apiId_apiId struct值并设置装箱副本的字段值。 它不会改变原作。

FieldInfo.SetValue的定义如下:

 public void SetValue( Object obj, Object value ) 

所以第一个参数,你的_apiId将被装箱。 拳击将复制结构值。 因此,SetValue将更改盒装副本而不是原始副本。

相反,您可以自己装箱:

 object apiId = new ApiId(); long vlue = ... typeof(ApiId)... _apiId = (ApiId)apiId; 

这是一个.NET小提琴演示。 尝试更改注释掉哪一行以查看差异。

上述就是C#学习教程:Getfield.SetValue不起作用分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/988950.html

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐