在我的项目中,我目前正在研究这个问题:

我想创建“ ApiID”类的实例。我从Reflector那里获得了代码,如您所见,.dll(不是我的Project)导入是从我无法访问的完全托管代码中导入的。

    [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);


代码成功运行,但是该字段未更改并保持为0 ...我在做什么错?
问候

最佳答案

这里的问题是拳击。

这行:

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


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

FieldInfo.SetValue的定义如下:

public void SetValue(
    Object obj,
    Object value
)


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

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

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


这是一个演示的.NET Fiddle。尝试更改注释掉的那一行以查看区别。

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

10-12 21:30