我安装了Silverlight 5 VS 2010工具和64位Developer运行时,现在我在执行特定操作时收到System.AccessViolationException。这些项目仍然是Silverlight 4,我还没有升级它们。我在另一台开发人员的计算机(尚未安装SL5)上验证了相同的代码仍可在SL4中运行。
消息是:{System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.}
并且它会杀死IE。
这是在删除确认后发生的,单击了ChildWindow的ok按钮,并且我的ok动作事件中的断点没有被击中(我有其他删除确认,使用类似的代码没有这个问题)。
堆栈跟踪指向
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase obj = {Telerik.Windows.Controls.RadWatermarkTextBox}, System.Windows.DependencyProperty property, string s) + 0x6f bytes
VS指向我的RadDateTimePicker自定义样式:"BindingDebugging!RadDateTimePickerxaml_2.BindingOperation_1100_562(object BindingState = {System.Windows.Data.Debugging.BindingDebugState}) Line 1 + 0x11 bytes Unknown"
我从控件和App.xaml中删除了样式,但仍然出现异常......这次它指向Telerik主题"The debugger will ask the user to find the file: Telerik.Windows.Controls.Input;Component\Themes\Office\Black\DateTimePicker.xaml"
我的同事提到,当他将一些格式错误的XAML发送给XMLWriter时,他在Silverlight中看到了同样的异常。
我会在找到它时添加更多信息。
有人知道该样式文件中要特别查找的内容吗?
编辑:我现在已经在几个地方看到了这个,而不仅仅是连接到DateTimePicker。我在http://forums.silverlight.net/p/245247/613094.aspx/1?p=True&t=634600762692144367交叉发布了这个帖子。我也通过此堆栈跟踪获得此异常。它不会每次都发生,但是当我使用RadNumericUpDown改变矩形的宽度并且调用RaisePropertyChanged(“Width”)时:>>
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase obj = {Telerik.Windows.Controls.PickerTextBox}, System.Windows.DependencyProperty property, string s) + 0x6f bytes
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase doh, System.Windows.DependencyProperty property, object obj) + 0x2ce bytes
System.Windows.dll!System.Windows.DependencyObject.SetObjectValueToCore(System.Windows.DependencyProperty dp, object value) + 0xd6 bytes
System.Windows.dll!System.Windows.DependencyObject.SetEffectiveValue(System.Windows.DependencyProperty property = {System.Windows.CoreDependencyProperty}, ref System.Windows.EffectiveValueEntry newEntry = {System.Windows.EffectiveValueEntry}, object newValue = "103") + 0x35 bytes
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyProperty property = {System.Windows.CoreDependencyProperty}, System.Windows.EffectiveValueEntry oldEntry, ref System.Windows.EffectiveValueEntry newEntry, System.Windows.DependencyObject.ValueOperation operation) + 0xe6 bytes
System.Windows.dll!System.Windows.DependencyObject.SetValueInternal(System.Windows.DependencyProperty dp, object value, bool allowReadOnlySet, bool isBindingInStyleSetter) + 0x248 bytes
System.Windows.dll!System.Windows.Controls.TextBox.Text.set(string value) + 0x33 bytes
Telerik.Windows.Controls.Input!Telerik.Windows.Controls.RadNumericUpDown.UpdateText() + 0x50 bytes
Telerik.Windows.Controls.Input!Telerik.Windows.Controls.RadNumericUpDown.OnValueChanged(Telerik.Windows.Controls.RadRangeBaseValueChangedEventArgs e = {Telerik.Windows.Controls.RadRangeBaseValueChangedEventArgs}) + 0xd6 bytes
编辑#2:编辑#2:
这似乎是相关的:http://forums.silverlight.net/p/178858/402638.aspx
编辑#3:编辑#3:
我无法在项目之外重现这一点。我也没有通过注释UserControls和代码段来阻止这种情况发生。我甚至从XAML和它似乎连接的RadNumericUpDown中删除了绑定。我还没有删除我们的自定义样式,也许这是接下来要尝试的东西...... 有谁知道如何重现这个并从那里开始工作?
编辑#4:他们根据:http://10rem.net/blog/2012/05/09/silverlight-51104110-released-today 修复了最新版本
答案 0 :(得分:3)
在数据绑定到隐藏元素时,我看到了这个异常。我们有一些可见或不基于某些数据绑定的字段,但这两个字段都使用另一个数据绑定进行更新。当在隐藏字段上触发RaisePropertyChanged时,我们得到AccessViolationException。我不得不在我的代码中添加一些检查,以在控件不可见时禁止RaisePropertyChanged。
答案 1 :(得分:2)
我们“在”更新到Silverlight 5后遇到了这个问题。在各种控件的加载事件期间设置(发件人为RadComboBox).ItemsSources时抛出了AccessViolationException。这个错误难以重现,并且并不总是在相同的测试条件下投入。但是,我认为最好的解决方法如下:
Silverlight 4:
(sender as RadComboBox).ItemsSource = OurClass.MakeOurList();
当我添加......时,问题就消失了。
Silverlight 5:
(sender as RadComboBox).UpdateLayout();
(sender as RadComboBox).ItemsSource = OurClass.MakeOurList();
我确信这是一个“解决方案”充其量,并希望听到更好的解决方案。但是现在我们已经恢复运行了!
答案 2 :(得分:1)
我们几个小时前提交的问题存在Microsoft Connect bug report。请投票,以便尽快修复。
RadComboBox已经包含一个变通方法,所以请检查您帐户下的最新内部版本,如果问题仍然存在,请告知我们。 Here is the Telerik forum thread关于同样的问题。
我希望这会有所帮助。
答案 3 :(得分:1)
我已经为我的自定义主题更新了DateTimePicker.xaml,以使用Microsoft的Textbox与RadWatermarkText作为我的解决方法。崩溃已经停止,但水印功能显然已经消失。
我大约一年前从Telerik下载了一个主题项目,所以我可以让他们的控件看起来和默认控件一样好。如果你们中的任何一个人希望和我一样,你会在他们的下载中找到DateTimePicker.xaml。
我发现Telerik控件太麻烦了,所以我选择不通过订阅不断支付错误修复。
答案 4 :(得分:0)
我终于找到了我的具体问题。它只发生在我继承的ChildWindow之后的一个元素。
我有这个黑客试图修复几个月前的错误。一旦我删除它,异常就停止了。我很确定我不再需要黑客,因为其他地方有所改进,所以这是一个双重奖励!我尝试在几个地方编组回调到UI线程的调用,但是计时器中的某些东西(应该是在UI线程上)不允许它(这是我的理论)。祝所有寻找答案的人好运。到目前为止的+1!
this.Closed += (s, e) =>
{
var timer = new System.Windows.Threading.DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(.25);
timer.Tick += (object senderTimer, EventArgs eTimer) =>
{
timer.Stop();
// without the timer, the content will disappear before the window closes
this.contentHolder.Child = null;
};
timer.Start();
};
我无法在单独的项目中使用ChildWindow重现这一点。所以这个答案没那么有用。