首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

Win7解决了Silverlight的SaveFileDialog的一个Bug?该怎么解决

2012-02-04 
Win7解决了Silverlight的SaveFileDialog的一个Bug?昨天在公司很碰巧在用SaveFileDialog()导出xml至硬盘,无

Win7解决了Silverlight的SaveFileDialog的一个Bug?
昨天在公司很碰巧在用SaveFileDialog()导出xml至硬盘,无意中选择了一个只有读取权限的目录,在提示了没有写入权限之后,过了一会就抛出了未处理异常,然后就整个页面一片空白了,在调试了代码之后,更改了一种写法,结果一样会出现异常,于是认为应是Silverlight的Bug,由于使用的是Silverlight 4 Beta,不敢确定是不是只是SL4的Bug。

回家后针对此问题重新调试起了程序,这次用的是 Silverlight 3.0 的版本,测试环境为 Windows XP、Win2003 和 Win7,代码如下:

C# code
private void button1_Click(object sender, RoutedEventArgs e){    SaveFileDialog saveFileDlg = new SaveFileDialog();    if (saveFileDlg.ShowDialog().Value)    {        try        {            // 尝试没有写入权限的目录(如局域网共享目录),Win2003 或 XP 马上出现异常            using (System.IO.Stream fs = saveFileDlg.OpenFile())                {            }        }        catch (Exception ex)        {            MessageBox.Show(ex.Message);        }    }}

打开一个没有写入权限的目录,输入文件名,Win2003 或 XP 马上 在saveFileDlg.OpenFile()这一句出现异常,并且异常被 catch,可是过了一会就会出现未捕获的异常(这个时间不定,时快时慢,有时还要点击一下页面上的其他控件才会出现),在WinXP下如下图(第一幅为MessageBox.Show(ex.Message)):


在 Win2003下如下图(第一幅为MessageBox.Show(ex.Message)):



看到未捕获异常的 FileStream.Finalize(),以为是 fs 在关闭时引发了异常,
C# code
            using (System.IO.Stream fs = saveFileDlg.OpenFile())                {            }


于是把代码改为
C# code
    SaveFileDialog saveFileDlg = new SaveFileDialog();    System.IO.Stream fs = null;    if (saveFileDlg.ShowDialog().Value)    {        try        {            // 尝试没有写入权限的目录(如局域网共享目录),Win2003 或 XP 马上出现异常            fs = saveFileDlg.OpenFile();        }        catch (Exception ex)        {            MessageBox.Show(ex.Message);        }        finally        {            // saveFileDlg.OpenFile()异常后不会执行 fs.Close(),因为 fs==null             if (fs != null)            {                try                {                    fs.Close();                }                catch (Exception ex)                {                    MessageBox.Show(ex.Message);                }            }        }    }

结果异常照旧,因为saveFileDlg.OpenFile() 发生异常后 fs.Close() 根本就不会被执行到,fs根本就是null。

那么怎么捕获这个未捕获的异常呢?会不会在这种情况下在 saveFileDlg.ShowDialog() 之前就应该 try...catch 了?于是又改代码为
C# code
    SaveFileDialog saveFileDlg = new SaveFileDialog();    try    {        if (saveFileDlg.ShowDialog().Value)        {            try            {                // 尝试没有写入权限的目录(如局域网共享目录),Win2003 或 XP 马上出现异常                using (System.IO.Stream fs = saveFileDlg.OpenFile())                    {                }            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }    catch (Exception ex)    {        MessageBox.Show(ex.Message);    }


结果还是一样的,照样捕获不了这个异常。

至此,我认为这个是 Silverlight 3.0 的Bug,在4.0 Beta中也没有解决,因为,我还没有说另外的一种测试环境,那就是在Win7下,尝试没有写入权限的目录时,SaveFileDialog 的确定按钮点击后根本就不会关闭Dialog,而是弹出下图

除非选择另一个有写入权限的目录或者是取消,否则saveFileDlg.ShowDialog()根本就不会返回,也就不会出现异常。

不知有人有兴趣?Copy代码运行一下试试~~~~

[解决办法]
-16,我这里是傍晚了,刚下班回家,就看到你起床了。
记得我过去测试过你说的这个问题,好像是针对Reporting Service的本地存取测试的,对于不同的操作系统,安全权限要求也不同,造成有的系统能够自动保存report到本地,有的则失败。
今天要翻出来温习一下~:)

热点排行