我为 Outlook 2003(vb.NET 4.0、WinXP SP3、Visual Studio 2010)编写的插件遇到了相当奇怪的行为。
我正在通过菜单打开一个设置窗口(Windows 窗体)。除了更改用户设置外,还可以单击按钮调用从远程服务器导入 XML 文件的函数。
除了从本地文件夹中删除旧文件并使用 My.Computer.FileSystem 方法从服务器复制新文件之外,此函数并没有做太多其他事情。
现在到了奇怪的部分:当文件被成功复制后,将显示一个消息框来通知用户。从关闭的那一刻起,Outlook 和设置窗口都会冻结,但并非完全冻结,因为您仍然可以使用键盘关闭设置表单。它只是不再对鼠标做出反应。如果我通过键盘关闭设置表单,我还会从调用表单的函数中收到“对象引用未设置为对象的实例”错误(在表单关闭后它立即进入错误处理)。Outlook 保持冻结状态,然后我必须终止该过程。
我注意到的其他事情:
1.) 如果新的 XML 文件没有被复制并且函数被提前终止(即因为当前版本已经存在或者服务器不可用),产生的消息框永远不会冻结程序。
2.) 将有问题的消息框从函数移动到表单的按钮单击事件不会改变任何内容。
3.)删除消息框解决了问题。但是设置表单创建的下一个消息框将导致相同的错误。
4.) 用 WPF System.Windows.MessageBox 替换通常的 System.Windows.Forms.MessageBox 也可以解决问题。但是,MsgBox 函数会导致相同的错误。
5.) 在 Outlook 中,我仍然可以通过鼠标浏览文件夹,但无法访问菜单栏或按钮,也无法使用“X”关闭窗口。
6.) 如果新文件无效,将被删除并重命名旧文件。在这种情况下,将显示两条消息,这一次程序只有在第二次单击该按钮并且在最后一个(第 4 个)消息框关闭之后才会冻结。如果设置表单在两次单击之间关闭并重新打开,则一切正常。此外,在设置表单关闭后,Outlook 本身可以正常使用(它不会冻结菜单/按钮)。
7.) 这发生在调试模式下,但也发生在正常模式下。
有谁知道为什么会这样?
谢谢!