今天在做一个VSTO (Visual Studio Tools for Office)的示例时遇到了点儿麻烦,一开始百思不得其解,后来找到问题的根源之后发现蛮有意思的,写出来和大家分享一下。
问题是这样的,我想在Word文档中通过Linked Assembly使用System.Xml命名空间中的功能,最简单的就是用XmlDocument载入整篇XML文档,然后再通过XPath查询取得所需的数据。这个在.NET开发时也经常遇到(是不是太小儿科了?),所以我就随手写了份XML文档作读取的测试,这份文档的内容如下:
?????
?????
XML文档的正确性先不说,我接着又在VSTO项目中增加一个辅助类用来读取这份xml文档并取出其中所有book的信息,然后在code behind文件里 (ThisDocument.cs)调用这个辅助类及相应方法来获取这些信息,然后在指定位置创建表格进行显示。OK,一切好像都进行得很顺利,可当Word文档运行时就是无法读出XML信息,也没有任何错误提示。这是怎么回事?
为了找到错误,我打开VS.NET的调试器,根据应用程序的运行,发现每当运行到下面这行代码之后,代码执行马上结束:
doc.LoadXml(this._fileFullPath);
怎么,无法正确读入XML文档?难道XML语法有误?这么一想,我再回过头仔细检查一下上面那份XML文档的代码,果然发现了问题——属性值应该包含在括号里,id=1应该写成id=”
看来错误应该找到了(而且是个低级错误),可是为什么Word在运行的时候一点儿错误的提示都没有呢?带着这问题又查了查帮助文档,果然有解答:
When you are developing Visual Studio Tools for Office projects you will find that if an exception occurs, it will not be shown in the Office application and execution of your code will simply end at that point. This can make it difficult to find and resolve bugs.
原来Word(以及Excel)在运行与之关联的.NET assembly时,一旦运行出错不会给出任何提示,从而也就出现了我上文中所提到的那种情况——应用程序运行非常“顺利”,但指定功能却无影无踪了。
文中还给出了两种解决办法:
You should include exception handling code in your projects to notify users of any issues. However, when debugging you can set the debug options to notify you of errors: in the Exceptions dialog box, change the When the exception is thrown option to Break into the debugger. Using this setting may result in you being notified that msosec.dll is not found. This error is not directly associated with your code and you can continue past it.
简而言之,我们可以通过手动增加错误例程处理(比如try… catch)来捕捉出错的迹象,另外也可以像上面英文资料中提示的那样,更改“异常”对话框(在“调试”-“异常”菜单中)中的相应设置,来达到出错时返回调试器的作用(必须是在调试状态下才可以)。这样,就可以在开发VSTO应用时即时捕捉到异常,并能尽早解决问题。
打印 | 张贴于 2004-06-17 21:46:00 | Tag:暂无标签
留言反馈