gpt4 book ai didi

c# - 公共(public)语言运行时检测到无效程序 - ILGenerator

转载 作者:行者123 更新时间:2023-11-30 16:14:17 29 4
gpt4 key购买 nike

基本上,我试图将字节数组中的数据反序列化为对象。我正在尝试使用 UTF8 编码的 GetString 方法来读取字符串。这是我的部分代码:

var mm = new DynamicMethod("get_value", typeof(object)
, new Type[] { typeof(byte[]), typeof(int), typeof(int), typeof(int) });

var utf8 = Encoding.GetEncoding("utf-8"); //l.GetValue(null, null).GetType().GetMethod("GetString");

var getstring = utf8.GetType().GetMethod("GetString", new Type[] { typeof(byte[]), typeof(int), typeof(int) });
// var getString = Encoding.UTF8.GetType().GetMethod("GetString", new Type[] { typeof(byte[]), typeof(int), typeof(int) });

var h = new EmitHelper(mm.GetILGenerator());

var defaultCase = h.ILGenerator.DefineLabel();

var lbs = new Label[] { h.DefineLabel(),h.DefineLabel()};

var getInt32Method = typeof(BitConverter).GetMethod("ToInt32", new Type[] { typeof(byte[]), typeof(int) });

//Arg0 = Byte [] , Arg1 = type, Arg2 = size, Arg3 = offset
h
.ldarg_1
.@switch(lbs)
.MarkLabel(defaultCase)
.ldnull
.ret();

h
.MarkLabel(lbs[0])
.ldarg_0
.ldarg_3
.call(getInt32Method)
.box(typeof(int))
.ret();

//THis is the function that is causing problem; If i remove this function works;
h
.MarkLabel(lbs[1])
.ldarg_0 //Load array
.ldarg_3 //Load Offset (index)
.ldarg_2 //Load Size (count)
.callvirt(getstring)
.boxIfValueType(typeof(string))
.ret();

return (GetValueDelegate)mm.CreateDelegate(typeof(GetValueDelegate));

我在这段代码之外检查了“getstring”的方法签名,它有效。我尝试删除“.boxIfAny”,我也尝试使用“call”而不是“callvirt”。据我了解,“callvirt”是适用于这种情况的实例方法。有什么想法吗?

最佳答案

调用GetString方法需要一个实例。

我已经简化了您的代码并将其变成了 SSCCE :

using System;
using System.Reflection.Emit;
using System.Text;

class GetStringDemo {
public static DynamicMethod GetStringForEncoding(Encoding encoding) {

var getstringMethod = encoding.GetType().GetMethod("GetString",
new Type[] { typeof(byte[]) });
var getStringCreator = new DynamicMethod("foo", typeof(string),
new Type[] { typeof(byte[]), encoding.GetType() }, typeof(void));
ILGenerator gen = getStringCreator.GetILGenerator();

gen.Emit(OpCodes.Ldarg_1); // this is the instance for callvirt
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Callvirt, getstringMethod);
gen.Emit(OpCodes.Box, typeof(string));
gen.Emit(OpCodes.Ret);

return getStringCreator;
}

public static void Main() {

var utf8 = Encoding.GetEncoding("utf-8");
var method = GetStringForEncoding(utf8);
Console.WriteLine(method.Invoke(null, new object[2] {
new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20,
0x32, 0x30, 0x31, 0x34, 0x21 },
utf8 } ));
}
}
// Output:
Hello 2014!

在调用h.ldarg_0//Load array 之前加载实际的调用目标。如果没有它,您确实会得到 mscorlib 抛出的 System.InvalidProgramException

关于c# - 公共(public)语言运行时检测到无效程序 - ILGenerator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20895918/

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