29
|
testalino · 技术社区 · 14 年前 |
1
54
只是解释为什么抛出这个异常。您可以使用此示例Windows窗体应用程序重新设置异常。首先添加一个名为“setting”的StringCollection类型的设置。单击“值”列中的点,然后输入两个字符串。使窗体类代码如下所示:
调试+异常,勾选clr异常的抛出复选框。运行表单并关闭它,当抛出异常时,调试器将停止。调用堆栈的顶部如下所示:
可以看到XmlSerializer类正在查找包含StringCollection类的XML序列化程序的程序集。在移除钻孔钻头的情况下,loadGeneratedAssembly方法如下所示:
和compiler.getTempAssemblyName():
在本例中,getTempAssemblyName是邪恶的执行者。StringCollection类位于System.dll程序集中,该方法生成名称“System.XmlSerializers”。此方法旨在查找您自己的类(由sgen.exe生成的类)的程序集。类似于示例程序的windowsapplication1.xmlserializers.dll。但StringCollection是.NET框架中的类,它生成的程序集名称无效。框架中实际上没有“system.xmlserializers.dll”程序集。 在connect.microsoft.com上关于此行为的反馈报告都已用“按设计”关闭。原来,最初的设计者认为防止异常的成本太高,所以决定只捕获异常。这一切都很好,但这个例外确实被抓住了。您只是碰巧看到它,因为您在“调试+异常”对话框中打开了“引发”复选框。 在这里,使XML序列化代码的行为不同不是一个选项。对于他们来说,简单地过滤掉system.dll程序集中的类型就足够容易了,但是这是一场可能永远不会结束的战斗,框架中还有很多程序集。解决方法是使用您自己的类来存储设置,而不是使用StringCollection。 |
2
6
因为这似乎是正常操作的一部分(另见: XmlSerializer giving FileNotFoundException at constructor )我只能提供两种解决方法: 禁用此特定异常:Goto调试/异常,单击Add,Type:C++异常,名称:EEFLIORADEXCEPTION(如果这是您所看到的异常),请取消该异常的抛出复选框。 将设置类型更改为string并访问它,例如:
|
3
1
您捕获的异常太多,System.XmlSerializer将始终将此异常作为其正常操作的一部分抛出,并由类本身捕获和处理。更改调试选项以仅捕获异常,而不是在.NET FarmeWork类中捕获和处理的异常。 |