作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试概括以下 IL(来自 Reflector):
.method private hidebysig instance void SetValue(valuetype Test.TestFixture/ValueSource& thing, string 'value') cil managed
{
.maxstack 8
L_0000: nop
L_0001: ldarg.1
L_0002: ldarg.2
L_0003: call instance void Test.TestFixture/ValueSource::set_Value(string)
L_0008: nop
L_0009: ret
}
但是,当我尝试使用 DynamicMethod 重现此 IL 时:
[Test]
public void Test_with_DynamicMethod()
{
var sourceType = typeof(ValueSource);
PropertyInfo property = sourceType.GetProperty("Value");
var setter = property.GetSetMethod(true);
var method = new DynamicMethod("Set" + property.Name, null, new[] { sourceType.MakeByRefType(), typeof(string) }, true);
var gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldarg_1); // Load input to stack
gen.Emit(OpCodes.Ldarg_2); // Load value to stack
gen.Emit(OpCodes.Call, setter); // Call the setter method
gen.Emit(OpCodes.Ret);
var result = (SetValueDelegate)method.CreateDelegate(typeof(SetValueDelegate));
var source = new ValueSource();
result(ref source, "hello");
source.Value.ShouldEqual("hello");
}
public delegate void SetValueDelegate(ref ValueSource source, string value);
我得到一个异常“Operation could destabilize the runtime”。 IL 似乎和我一样,有什么想法吗? ValueSource 是一个值类型,这就是为什么我在这里做一个 ref 参数。
编辑
这是 ValueSource 类型:
public struct ValueSource
{
public string Value { get; set; }
}
最佳答案
将参数更改为 0/1(不是 1/2):
gen.Emit(OpCodes.Ldarg_0); // Load input to stack
gen.Emit(OpCodes.Ldarg_1); // Load value to stack
因为它似乎被创建为静态的动态方法,而不是实例(您的原始方法是实例)- 因此参数差了一个。
(很抱歉原来的错误答案 - 您可以将其他代码保留为 true
)
关于c# - "Operation could destablize the runtime"和具有值类型的 DynamicMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1277779/
我正在尝试概括以下 IL(来自 Reflector): .method private hidebysig instance void SetValue(valuetype Test.TestFixt
我是一名优秀的程序员,十分优秀!