gpt4 book ai didi

c# - Getfield.SetValue 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:11 33 4
gpt4 key购买 nike

在我目前正在处理的项目中,我偶然发现了这个问题:

我想创建类“ApiID”的实例。我从 Reflector 获得了代码,如您所见,.dll(不是我的项目)导入来自非托管代码,我无权访问。

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

public static unsafe void <MarshalDestroy>(ApiId* idPtr1)
{
ApiId.{dtor}(idPtr1);
}
}

我的 C# 代码如下所示:

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

代码运行成功,但 Field 没有改变并保持为 0...我做错了什么?问候

最佳答案

这里的问题是装箱

这一行:

typeof(ApiId).GetField("<alignment member>", ...).SetValue(_apiId, vlue);

将装箱_apiId 中的结构值并设置装箱副本的字段值。它不会改变原来的。

FieldInfo.SetValue定义如下:

public void SetValue(
Object obj,
Object value
)

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

相反,您可以自己装箱对象:

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

这是一个 .NET Fiddle这表明。尝试更改被注释掉的行以查看差异。

关于c# - Getfield.SetValue 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27226731/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com