Pep*_*lee 1 c# reflection pinvoke
在我正在研究的项目中,我偶然发现了这个问题:
我想创建一个类"ApiID"的实例.我从Reflector获得了代码,因为你可以看到.dll(不是我的Project)导入来自ummanaged代码,我无权访问.
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的C#-Code看起来像这样:
var _apiId = new ApiId();
long vlue = 0x0000000041403070;
typeof(ApiId).GetField("<alignment member>", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(_apiId, vlue);
Run Code Online (Sandbox Code Playgroud)
该代码成功运行,但是Field不会改变并保持0 ...我做错了什么?问候
这里的问题是拳击.
这一行:
typeof(ApiId).GetField("<alignment member>", ...).SetValue(_apiId, vlue);
Run Code Online (Sandbox Code Playgroud)
将框入结构值_apiId并设置框装副本的字段值.它不会改变原作.
FieldInfo.SetValue的定义如下:
public void SetValue(
Object obj,
Object value
)
Run Code Online (Sandbox Code Playgroud)
所以第一个参数,你_apiId将被装箱.拳击将复制结构值.因此,SetValue将更改盒装副本而不是原始副本.
相反,您可以自己装箱:
object apiId = new ApiId();
long vlue = ...
typeof(ApiId)...
_apiId = (ApiId)apiId;
Run Code Online (Sandbox Code Playgroud)
这是一个.NET小提琴演示.尝试更改注释掉哪一行以查看差异.
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |