C# 为什么将RichTextBox上的XAML属性设置为该值会使Silverlight崩溃?

C# 为什么将RichTextBox上的XAML属性设置为该值会使Silverlight崩溃?,c#,silverlight,silverlight-4.0,C#,Silverlight,Silverlight 4.0,在对我正在使用的HTML到XAML转换器进行测试时,我遇到了一个无法解释的奇怪情况。由于HTML到XAML转换器中的一个错误,我得到了这个XAML: <Section xml:space="preserve" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" /> 为什么这个异常没有被捕获?我尝试添加AccessViolationException捕获,但这并没有改变任何事情。谢谢你抽出时间 (注意:

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

<Section xml:space="preserve" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />
为什么这个异常没有被捕获?我尝试添加AccessViolationException捕获,但这并没有改变任何事情。谢谢你抽出时间


(注意:这是Silverlight 4)

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

RichTextBox中的Xaml属性使用XamlReader解析Xaml。这是隐藏的本机代码。异常在本机代码中抛出,本机代码并不总是最有用的异常

由于某些原因,XamlReader不接受selfclosing节标记

// 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>");
//提供AccessViolationException。
XamlReader.Load(“”);
//有效的。。。
XamlReader.Load(“”);
为了让事情变得更奇怪,出于某种原因,TextBlock确实接受selfclosing标记

// 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.Load(“”);
//有效的。。。
XamlReader.Load(“”);

我不确定,但可能是因为在XamlReader内部,部分需要一个子节点或类似的东西,而TextBlock则不需要。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);
}
我敢打赌在XAML解析器的深处有一个Dispatcher.BeginInvoke()隐藏


值得一提的是,BitmapImage.SetSource()也发生了类似的情况。请参见此处的问题:

您是否能够捕获XamlReader.Load引发的异常?它似乎忽视了我的每一次尝试。不,我抓不到它。我猜是因为异常不在托管代码中,并且在agcore.dll中的某个地方。这就是为什么部分解析器不接受自动关闭标记。啊。值得提出一个连接错误。我已经这样做了,从来没有任何反馈:
try
{
    Deployment.Current.Dispatcher.BeginInvoke(() => throw new Exception("Sucks to be you."));
}
catch(System.Exception ex)
{
     ErrorMessageBox.Show(ex.Message);
}