gpt4 book ai didi

c# - "Operation could destablize the runtime"和具有值类型的 DynamicMethod

转载 作者:太空狗 更新时间:2023-10-29 21:48:06 26 4
gpt4 key购买 nike

我正在尝试概括以下 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/

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