为什么将RichTextBox上的XAML属性设置为此值会导致Silverlight崩溃?

时间:2010-09-03 03:05:02

标签: c# silverlight silverlight-4.0

在对我正在研究的HTML到XAML转换器进行一些测试时,遇到了一个我无法解释的奇怪情况。由于我的HTML到XAML转换器中的错误,我得到了这个XAML:

<Section xml:space="preserve" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />

当我将RichTextBox的XAML属性设置为此字符串时,它会忽略我的try / catch并使用此错误崩溃整个应用程序:

System.AccessViolationException未处理 Message =尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我的代码很简单:

try {
    rtb.Xaml = ptb.Text;
} catch (Exception ex) {
    MessageBox.Show(ex.Message);
}

为什么没有抓住这个例外?我尝试添加一个AccessViolationException catch,但这并没有改变任何东西。谢谢你的时间。

(注意:这是Silverlight 4)

2 个答案:

答案 0 :(得分:1)

不确定它有用,但这是我发现的:

RichTextBox内的Xaml属性使用XamlReader来解析Xaml。这是引擎盖下的本机代码。在本机代码中抛出异常,这始终是最有用的异常。

由于某种原因,XamlReader不接受自闭合段标记。

// Gives AccessViolationException.
XamlReader.Load("<Section xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />");

// Valid...
XamlReader.Load("<Section xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Section>");

为了使事情变得更奇怪,由于某种原因,TextBlock确实接受了自我标记。

// Valid...
XamlReader.Load("<TextBlock xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />");

// Valid...
XamlReader.Load("<TextBlock xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></TextBlock>");

我不确定,但也许是因为在XamlReader中,Section部分需要一个子节点或类似于TextBlock的子节点。

答案 1 :(得分:0)

Silverlight显然要求我们以“异步”方式执行大多数操作,这会增加错误捕获的各种奇怪之处。我怀疑是这样的事情发生在这里。据推测,对XamlReader.Load()的调用正在启动异步执行的操作(尽管可能在同一个线程上,通过类似Dispatcher.BeginInvoke()),并且当该操作遇到错误时,它不会被捕获通过普通的try / catch机制,因为执行已经超越了catch()子句。

例如,此代码将抛出未处理的错误:

try
{
    Deployment.Current.Dispatcher.BeginInvoke(() => throw new Exception("Sucks to be you."));
}
catch(System.Exception ex)
{
     ErrorMessageBox.Show(ex.Message);
}

我敢打赌,有一个Dispatcher.BeginInvoke()隐藏在XAML解析器的深处。

对于它的价值,BitmapImage.SetSource()会发生类似的事情。在此处查看此问题:Handling image load exception gracefully