代码之家  ›  专栏  ›  技术社区  ›  Qwertie

什么可能导致此ExecutionEngineeException?

  •  1
  • Qwertie  · 技术社区  · 15 年前

    包装器类实现 IEnumerable<string> 和包装 List<string>

    class List1_7931B0B4_79328AA0 : IEnumerable<string>
    {
        private readonly List<string> _obj;
    
        public List1_7931B0B4_79328AA0(List<string> obj)
        {
            this._obj = obj;
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this._obj.GetEnumerator();
        }
        public sealed IEnumerator<string> GetEnumerator()
        {
            return this._obj.GetEnumerator();
        }
    }
    

    但是,当我尝试调用包装类上的GetEnumerator()方法时,会得到executionEngineeException。所以我把动态程序集保存到一个DLL中,并在上面使用了ildasm。下面的代码有什么问题吗?

    .class public auto ansi sealed List`1_7931B0B4_79328AA0
        extends [mscorlib]System.Object
        implements [mscorlib]System.Collections.Generic.IEnumerable`1<string>, 
                   [Loyc.Runtime]Loyc.Runtime.IGoInterfaceWrapper
    {
        .field private initonly class 
            [mscorlib]System.Collections.Generic.List`1<string> _obj
    
        .method public hidebysig virtual final instance 
                class [mscorlib]System.Collections.Generic.IEnumerator`1<string> 
                GetEnumerator() cil managed
        {
            // Code size       12 (0xc)
            .maxstack  1
            IL_0000:  ldarg.0
            IL_0001:  ldfld      class [mscorlib]System.Collections.Generic.List`1<string> List`1_7931B0B4_79328AA0::_obj
            IL_0006:  call       instance valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!0> class [mscorlib]System.Collections.Generic.List`1<string>::GetEnumerator()
            IL_000b:  ret
        } // end of method List`1_7931B0B4_79328AA0::GetEnumerator
    
    
        .method public hidebysig virtual final instance 
                class [mscorlib]System.Collections.IEnumerator 
                System.Collections.IEnumerable.GetEnumerator() cil managed
        {
            .override [mscorlib]System.Collections.IEnumerable::GetEnumerator
            // Code size       12 (0xc)
            .maxstack  1
            IL_0000:  ldarg.0
            IL_0001:  ldfld      class [mscorlib]System.Collections.Generic.List`1<string> List`1_7931B0B4_79328AA0::_obj
            IL_0006:  call       instance valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!0> class [mscorlib]System.Collections.Generic.List`1<string>::GetEnumerator()
            IL_000b:  ret
        } // end of method List`1_7931B0B4_79328AA0::System.Collections.IEnumerable.GetEnumerator
        ...
    

    我有一个测试套件,它包装了各种不同的东西,包括从其他接口派生的接口,以及具有相同签名的多个接口方法。只有当我试着包装的时候 IEnumerable<T> 这个问题发生了。如果有人愿意,我很乐意发送源代码(2*.cs文件,没有依赖项)。

    1 回复  |  直到 15 年前
        1
  •  3
  •   kvb    15 年前

    List<T> 实际上有3个 GetEnumerator() 方法;它显式实现 IEnumerable.GetEnumerator() IEnumerable<T>.GetEnumerator() ,但它也有一个公共的 GetEnumerator() 方法返回 List<T>.Enumerator 实例,它是值类型。您的代码正在调用该方法,因此需要插入 box call 以及 ret

    为了将来的参考,如果您只需编译示例C代码并在Reflector中查看它,并将其与您自己的IL进行比较,那么这一点很容易理解。