具体情景描述如下:
http://blog.csdn.net/cuipengfei1/archive/2009/02/18/3905368.aspx
即使在TheForm中用try -catch来把访问dll的代码包含起来,还是会发生截图中报错的结果。这是为什么呢?

解决方案 »

  1.   

    我觉得是try catch的实现的原因吧,可能不能判断这么“底层”的东西
      

  2.   

    因为你的新的dll代码,跟当前解决方案中的对应的dll代码不一致,重新引入,并编译一下应该就可以
      

  3.   

    这个我知道。
    因为MSIL不兼容而造成的异常不可以用try catch来捕捉?
      

  4.   

                try            {                TheDLL.DataHolder DH = new TheDLL.DataHolder();                button1.Text = DH.Data;            }            catch (Exception)            {                            }试了一下,把            catch (Exception){}改成            catch {}照样还是不能捕获这个异常。具体的异常是:未处理的异常:  System.MissingFieldException: 找不到字段:“DataHolder.Data”。看来偷偷地改变 dll 的这种异常是不能为 .net 所捕获的。
      

  5.   

    偷偷地改变 dll 的这种异常是不能为 .net 所捕获的
    那...why?
      

  6.   

    可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/system.missingfieldexception.aspx.NET Framework 类库
    MissingFieldException 类通常,如果代码试图访问不存在的类成员,会生成编译错误。MissingFieldException 则设计来处理这样一种情况:试图动态访问程序集中已重命名或已删除的字段,而该程序集并不是按其强名称来引用的。当相关程序集中的代码试图访问已经修改的程序集中已不存在的字段时,就会引发 MissingFieldException。其中有个示例此示例演示在您尝试使用反射来调用不存在的方法和访问不存在的字段时所发生的情况。应用程序通过捕捉 MissingMethodException、MissingFieldException 和 MissingMemberException 来恢复。确实,用反射来调用不存在的方法和访问不存在的字段时会引发并可以捕获该异常。但我们偷偷地改变 dll 时就无法捕获该异常了。
    MSDN 另外有个解释:http://msdn.microsoft.com/zh-cn/library/ze74ahef.aspxVisual Studio 调试器
    关于异常的疑难解答:System.MissingFieldException如果类库中的某个字段已被移除或重命名,请重新编译引用该库的所有程序集。
      

  7.   

    应该是说,不是通过反射,而是静态地直接使用某字段,如果该字段不存在,会生成编译错误。 但我们偷偷地改变 dll 时就无法捕获该异常了。 
      

  8.   

    应该是说,不是通过反射,而是静态地直接使用某字段,如果该字段不存在,会生成编译错误。 但如果我们在编译时该字段存在,并且是静态地直接使用该字段,编译成功,代码静态地使用该字段。
    然后,偷偷地改变 dll 时,因为不需要动态地在运行时生成该字段的引用,就无法捕获该异常了。如果是通过反射在运行时访问该字段,而发现字段不存在,就可以捕获该异常。不知是不是这样的。
      

  9.   


    我说的静态是相对于反射而言的,反射是动态地访问。比如象这样:
                 button1.Text = DH.Data;直接访问 DH.Data 就属于静态地使用该字段。如果是通过反射来访问 DH.Data ,而不是在代码中直接写 DH.Data ,就是动态地访问。
      

  10.   

    这个是JIT报出来的错误,JIT无法翻译IL成native code,因为它找不到这个叫Data的字段(因为变成属性了)
    而JIT的翻译单位是方法,在翻译完一个方法后,才会运行到这个方法。
    所以,在这个方法第一次被调用的时候,JIT试图翻译这个方法,抛出了这个错误,而try-catch有在这个方法内,一个没有翻译成native code的方法内的所有代码自然不会运行,即,此时根本还没运行到try的范围内,自然不能捕捉的异常。
      

  11.   

    但是它的第一次调用不是在这里吗?
    TheDLL.DataHolder DH = new TheDLL.DataHolder();
      

  12.   

    很有意思,我没试过类似的东西,但似乎这些应该是系统才能捕获的,.NET框架估计只能捕获到其定义过的...
      

  13.   

    没看你的代码.
    改了dll.程序域的session会丢失.
    会不会是同样的道理?.net会和内存中的dll对比.不同要重新加载.再运行.而你还没加载新的。可能根本捕捉不到吧.猜猜.
      

  14.   

    出现这一句的不也是在button1_Click方法内吗?
    既然button1_Click无法被翻译成native code,那么谁去调用DataHolder的构造函数哪?
      

  15.   

    这个错误不是自身try -catch能捕获的了。这个应该是framework框架组装调用库的时候就爆出来了。如果能轻易的在程序运行的时候修改dll,那就太没有安全性可言了,v.netframework就太差劲了,呵呵。
      

  16.   

    JIT爆出的异常我们无法捕获?