Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试执行生成的代码时发生异常_C#_Ilgenerator - Fatal编程技术网

C# 尝试执行生成的代码时发生异常

C# 尝试执行生成的代码时发生异常,c#,ilgenerator,C#,Ilgenerator,我正在为动态类型实现构造函数,但当我执行代码时,它会抛出一个异常,即IL代码已损坏(FatalExecutionError) IL码 工作部分: .method assembly specialname rtspecialname instance void .ctor ( object '', object '', string '' ) cil managed { // Method begins at RVA 0xa370 // Code size 36 (0x

我正在为动态类型实现构造函数,但当我执行代码时,它会抛出一个异常,即IL代码已损坏(
FatalExecutionError

IL码 工作部分:

.method assembly specialname rtspecialname 
instance void .ctor (
    object '',
    object '',
    string ''
) cil managed 
{
// Method begins at RVA 0xa370
// Code size 36 (0x24)
.maxstack 2
.locals init (
    [0] class [mscorlib]System.Collections.IList,
    [1] class [mscorlib]System.Collections.IList
)

IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld object HIDDEN.PropertyComparison::_Object0
IL_0007: ldarg.0
IL_0008: ldarg.2
IL_0009: stfld object HIDDEN.PropertyComparison::_Object1
IL_000e: ldarg.0
IL_000f: ldarg.3
IL_0010: stfld string HIDDEN.PropertyComparison::_Name
// Return is here normally when not using the following code
添加以下IL代码时会发生错误。它一定和代码有关,或者是其他一些奇怪的行为,只发生在代码之前的代码中

IL_0015: ldarg.1
IL_0016: isinst [mscorlib]System.Collections.IList
IL_001b: stloc.0
IL_001c: ldarg.2
IL_001d: isinst [mscorlib]System.Collections.IList
IL_0022: stloc.1
IL_0023: ret
} // end of method PropertyComparison::.ctor
关键是导致错误的行(似乎它们是错误的原因)只是一个简单的
,当谈到C#时,就不多了。如果有人有办法解决这个问题,那就太好了

生成代码
PropertyComparisonType=\u Module.DefineType(“HIDDEN.PropertyComparison”,TypeAttributes.Public,typeof(Object));
FieldBuilder object0Field=PropertyComparisonType.DefineField(“\u Object0”,typeof(Object),FieldAttributes.Private);
FieldBuilder object1Field=PropertyComparisonType.DefineField(“\u Object1”,typeof(Object),FieldAttributes.Private);
FieldBuilder equalField=PropertyComparisonType.DefineField(“_Equal”,typeof(布尔),FieldAttributes.Private);
FieldBuilder nameField=PropertyComparisonType.DefineField(“\u Name”,typeof(String),FieldAttributes.Private);
FieldBuilder childsField=PropertyComparisonType.DefineField(“\u Childs”,typeof(IEnumerable)。MakeGenericType(PropertyComparisonType),FieldAttributes.Private);
PropertyBuilder object0Property=PropertyComparisonType.DefineProperty(“Object0”,object0Field,setter:false);
PropertyBuilder object1Property=PropertyComparisonType.DefineProperty(“Object1”,Object1字段,setter:false);
PropertyBuilder equalProperty=PropertyComparisonType.DefineProperty(“相等”,equalField,setter:false);
PropertyBuilder nameProperty=PropertyComparisonType.DefineProperty(“名称”,名称字段,设置器:false);
PropertyBuilder childsProperty=PropertyComparisonType.DefineProperty(“Childs”,childsField,setter:false);
PropertyComparisonConstructor=PropertyComparisonType.DefineConstructor(MethodAttributes.Assembly,CallingConventions.Standard,new[]{typeof(Object),typeof(Object),typeof(String)});
ILGenerator il=PropertyComparisonConstructor.GetILGenerator();
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_1);
il.Emit(操作码.Stfld,object0字段);
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_2);
il.Emit(操作码.Stfld,对象1字段);
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_3);
il.Emit(操作码.Stfld,名称字段);
LocalBuilder localList0=il.DeclareLocal(typeof(IList));
LocalBuilder localList1=il.DeclareLocal(typeof(IList));
il.Emit(操作码Ldarg_1);
il.Emit(opcode.Isinst,typeof(IList));
il.Emit(opcode.Stloc,localList0);
il.Emit(操作码Ldarg_2);
il.Emit(opcode.Isinst,typeof(IList));
il.Emit(opcode.Stloc,localList1);
Castclass(编辑) 我注意到,
OpCodes.Castclass
不会抛出错误,但当运行时试图抛出无效对象时,当然会抛出运行时错误

另一件疯狂的事(编辑2) 我还注意到,当我将最后一个
Isinst
Castclass
交换时,它可以工作,不会抛出任何错误。这让我更加怀疑这个错误。当注释掉生成castclass的行时,错误又回来了。

我尝试了你的代码(必须将构造函数更改为
MethodAttributes.Public
,才能使它正常工作),它工作得很好。很抱歉,这不是一个真正的答案,但我想展示一下我使用的代码,以防它指出任何可能有用的差异:

class Program
{
    static void Main(string[] args)
    {
        var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("foo"), AssemblyBuilderAccess.RunAndSave);
        var _Module = assembly.DefineDynamicModule("fooModule");

        var PropertyComparisonType = _Module.DefineType("HIDDEN.PropertyComparison", TypeAttributes.Public, typeof(Object));
        FieldBuilder object0Field = PropertyComparisonType.DefineField("_Object0", typeof(Object), FieldAttributes.Private);
        FieldBuilder object1Field = PropertyComparisonType.DefineField("_Object1", typeof(Object), FieldAttributes.Private);
        FieldBuilder equalField = PropertyComparisonType.DefineField("_Equal", typeof(Boolean), FieldAttributes.Private);
        FieldBuilder nameField = PropertyComparisonType.DefineField("_Name", typeof(String), FieldAttributes.Private);
        FieldBuilder childsField = PropertyComparisonType.DefineField("_Childs", typeof(IEnumerable<>).MakeGenericType(PropertyComparisonType), FieldAttributes.Private);

        var PropertyComparisonConstructor = PropertyComparisonType.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new[] { typeof(Object), typeof(Object), typeof(String) });
        ILGenerator il = PropertyComparisonConstructor.GetILGenerator();


        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Stfld, object0Field);

        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_2);
        il.Emit(OpCodes.Stfld, object1Field);

        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_3);
        il.Emit(OpCodes.Stfld, nameField);

        LocalBuilder localList0 = il.DeclareLocal(typeof(IList));
        LocalBuilder localList1 = il.DeclareLocal(typeof(IList));

        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Isinst, typeof(IList));
        il.Emit(OpCodes.Stloc, localList0);
        il.Emit(OpCodes.Ldarg_2);
        il.Emit(OpCodes.Isinst, typeof(IList));
        il.Emit(OpCodes.Stloc, localList1);
        il.Emit(OpCodes.Ret);

        var type = PropertyComparisonType.CreateType();

        var list1 = new List<string>();
        var list2 = new List<string>();
        var s = "prop";
        var instance = Activator.CreateInstance(type, list1, list2, s);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var assembly=AppDomain.CurrentDomain.DefinedDynamicAssembly(新的AssemblyName(“foo”)、AssemblyBuilderAccess.RunAndSave);
var_Module=assembly.defineddynamicmodule(“foodmodule”);
var PropertyComparisonType=_Module.DefineType(“HIDDEN.PropertyComparison”,TypeAttributes.Public,typeof(Object));
FieldBuilder object0Field=PropertyComparisonType.DefineField(“\u Object0”,typeof(Object),FieldAttributes.Private);
FieldBuilder object1Field=PropertyComparisonType.DefineField(“\u Object1”,typeof(Object),FieldAttributes.Private);
FieldBuilder equalField=PropertyComparisonType.DefineField(“_Equal”,typeof(布尔),FieldAttributes.Private);
FieldBuilder nameField=PropertyComparisonType.DefineField(“\u Name”,typeof(String),FieldAttributes.Private);
FieldBuilder childsField=PropertyComparisonType.DefineField(“\u Childs”,typeof(IEnumerable)。MakeGenericType(PropertyComparisonType),FieldAttributes.Private);
var PropertyComparisonConstructor=PropertyComparisonType.DefineConstructor(MethodAttributes.Public,CallingConventions.Standard,new[]{typeof(Object),typeof(Object),typeof(String)});
ILGenerator il=PropertyComparisonConstructor.GetILGenerator();
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_1);
il.Emit(操作码.Stfld,object0字段);
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_2);
il.Emit(操作码.Stfld,对象1字段);
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_3);
il.Emit(操作码.Stfld,名称字段);
LocalBuilder localList0=il.DeclareLocal(typeof(IList));
LocalBuilder localList1=il.DeclareLocal(typeof(IList));
il.Emit(操作码Ldarg_1);
il.Emit(opcode.Isinst,typeof(IList));
il.Emit(opcode.Stloc,localList0);
il.Emit(操作码Ldarg_2);
il.Emit(opcode.Isinst,typeof(IList));
il.Emit(opcode.Stloc,localList1);
发射(操作码Ret);
var type=PropertyComparisonType.CreateType();
var list1=新列表();
var list2=新列表();
var s=“prop”;
var instance=Activator.CreateInstance(类型,list1,list2,s);
}
}
我尝试了您的代码(必须将构造函数更改为
MethodAttributes.Public
才能获得
class Program
{
    static void Main(string[] args)
    {
        var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("foo"), AssemblyBuilderAccess.RunAndSave);
        var _Module = assembly.DefineDynamicModule("fooModule");

        var PropertyComparisonType = _Module.DefineType("HIDDEN.PropertyComparison", TypeAttributes.Public, typeof(Object));
        FieldBuilder object0Field = PropertyComparisonType.DefineField("_Object0", typeof(Object), FieldAttributes.Private);
        FieldBuilder object1Field = PropertyComparisonType.DefineField("_Object1", typeof(Object), FieldAttributes.Private);
        FieldBuilder equalField = PropertyComparisonType.DefineField("_Equal", typeof(Boolean), FieldAttributes.Private);
        FieldBuilder nameField = PropertyComparisonType.DefineField("_Name", typeof(String), FieldAttributes.Private);
        FieldBuilder childsField = PropertyComparisonType.DefineField("_Childs", typeof(IEnumerable<>).MakeGenericType(PropertyComparisonType), FieldAttributes.Private);

        var PropertyComparisonConstructor = PropertyComparisonType.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new[] { typeof(Object), typeof(Object), typeof(String) });
        ILGenerator il = PropertyComparisonConstructor.GetILGenerator();


        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Stfld, object0Field);

        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_2);
        il.Emit(OpCodes.Stfld, object1Field);

        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_3);
        il.Emit(OpCodes.Stfld, nameField);

        LocalBuilder localList0 = il.DeclareLocal(typeof(IList));
        LocalBuilder localList1 = il.DeclareLocal(typeof(IList));

        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Isinst, typeof(IList));
        il.Emit(OpCodes.Stloc, localList0);
        il.Emit(OpCodes.Ldarg_2);
        il.Emit(OpCodes.Isinst, typeof(IList));
        il.Emit(OpCodes.Stloc, localList1);
        il.Emit(OpCodes.Ret);

        var type = PropertyComparisonType.CreateType();

        var list1 = new List<string>();
        var list2 = new List<string>();
        var s = "prop";
        var instance = Activator.CreateInstance(type, list1, list2, s);
    }
}