Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 这个CIL有什么问题?_C#_.net_Cil_Mono.cecil - Fatal编程技术网

C# 这个CIL有什么问题?

C# 这个CIL有什么问题?,c#,.net,cil,mono.cecil,C#,.net,Cil,Mono.cecil,我正在通过Cecil生成一些代码。代码生成时没有错误,但当我尝试加载程序集时,我得到: “System.InvalidProgrameException”类型的未处理异常 发生在DataSerializerTest.exe中 其他信息:公共语言运行库检测到无效的 节目 以下是生成的IL: .method public static class Data.FooData Read ( class [mscorlib]System.IO.BinaryReader input

我正在通过Cecil生成一些代码。代码生成时没有错误,但当我尝试加载程序集时,我得到:

“System.InvalidProgrameException”类型的未处理异常 发生在DataSerializerTest.exe中

其他信息:公共语言运行库检测到无效的 节目

以下是生成的IL:

.method public static 
    class Data.FooData Read (
        class [mscorlib]System.IO.BinaryReader input
    ) cil managed 
{
    // Method begins at RVA 0x3a58
    // Code size 60 (0x3c)
    .maxstack 3
    .locals (
        [0] class Data.FooData,
        [1] valuetype [System.Runtime]System.Nullable`1<int32>
    )

    IL_0000: newobj instance void Data.FooData::.ctor()
    IL_0005: stloc.0
    IL_0006: ldloc.0
    IL_0007: ldarg.0
    IL_0008: callvirt instance bool [System.IO]System.IO.BinaryReader::ReadBoolean()
    IL_000d: ldc.i4.0
    IL_000e: ceq
    IL_0010: brtrue.s IL_001f

    IL_0012: ldarg.0
    IL_0013: callvirt instance int32 [System.IO]System.IO.BinaryReader::ReadInt32()
    IL_0018: newobj instance void valuetype [System.Runtime]System.Nullable`1<int32>::.ctor(!0)
    IL_001d: br.s IL_0028

    IL_001f: nop
    IL_0020: ldloca.s 1
    IL_0022: initobj valuetype [System.Runtime]System.Nullable`1<int32>

    IL_0028: nop
    IL_0029: callvirt instance void Data.FooData::set_I(valuetype [System.Runtime]System.Nullable`1<int32>)
    IL_002e: ldloc.0
    IL_002f: ldarg.0
    IL_0030: callvirt instance string [System.IO]System.IO.BinaryReader::ReadString()
    IL_0035: callvirt instance void Data.FooData::set_Name(string)
    IL_003a: ldloc.0
    IL_003b: ret
} // end of method FooDataReader::Read

我已经通过IL工作了好几次,这对我来说是有意义的。这与C#编译器为上述C#代码生成的代码不同,但我想了解我生成的IL有什么问题。有人能告诉我吗?我想我已经发现了
initobj
不会将新初始化的对象保留在计算堆栈上,而
newobj
会保留。因此,当到达
IL_0028
时,堆栈是不平衡的-如果我们走了
newobj
路线,那么堆栈上有两个项目(
FooData
Nullable
)。如果我们走了
initobj
路线,那么我们所拥有的就是堆栈上的
FooData
对象引用。您需要重新加载本地
1

IL_0022: initobj valuetype [System.Runtime]System.Nullable`1<int32>
         ldloc.1
IL_0028: nop
IL_0022:initobj valuetype[System.Runtime]System.Nullable`1
ldloc.1
IL_0028:没有

您是否也可以添加编译器为相同代码生成的代码,不信者Damien#u:C#编译器采用了一种完全不同的方法,使用几个局部变量而不是堆栈-不同到足以让我认为这分散了我对为什么我的方法无效的问题的注意力。不过,我下次在我的开发机器上发布它。在上面运行PEVerify。它会告诉你确切的问题!IL的生成就好像
I
成员是FooData的静态属性一样。它看起来确实不像C代码段中的代码。set_I()的参数丢失,堆栈不平衡。你真的想用C#编译器在这段代码上有一个好的开始。@HansPassant-将
FooData
实例放在
IL_0006
的堆栈上,直到最后的
set_I
调用,不是吗?谢谢-这确实是问题所在。有趣的是,PEVerify甚至没有将其标记为问题。然而,PEVerify确实抱怨“必须为具有一个或多个局部变量的可验证方法设置initlocals”。不知道该怎么做,但我现在可以加载和使用代码了。
IL_0022: initobj valuetype [System.Runtime]System.Nullable`1<int32>
         ldloc.1
IL_0028: nop