Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена

Как и во многих других темах, у меня проблема с тем, что это исключение возникает в одном конкретном месте (5% времени) и где-то еще.

Первая строка кода такова

 ((DefinitionDetailForm.FindNameInContent("DataFieldDefinitionPoints") as DataField).
                        FindName("DefinitionScoringPoints") as RadNumericUpDown).
                        Minimum = 0;

Сначала я подумал, что мне, возможно, нужно сохранить ссылку в поле, но это тоже не помогло.

Другая ситуация находится в неопределенном месте, для которого я даже ничего не получаю в стеке вызовов, поэтому я не могу дать больше информации :(

У кого-нибудь есть хоть какое-то представление о первом?

Редактировать:

Стек вызовов, когда что-то ломается

[Managed to Native Transition]  
System.Windows.dll!MS.Internal.XcpImports.SetValue(MS.Internal.IManagedPeerBase obj, 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, ref System.Windows.EffectiveValueEntry newEntry, object newValue) + 0x35 bytes 
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyProperty property, 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() + 0xa5 bytes  
Telerik.Windows.Controls.Input!Telerik.Windows.Controls.RadNumericUpDown.OnValueChanged(Telerik.Windows.Controls.RadRangeBaseValueChangedEventArgs e) + 0x1f5 bytes 
Telerik.Windows.Controls!Telerik.Windows.Controls.RadRangeBase.OnValueChanged(System.Windows.DependencyObject d, System.Windows.DependencyPropertyChangedEventArgs e) + 0x105 bytes 
Telerik.Windows.Controls!Telerik.Windows.PropertyMetadata.PropertyChangeHook.OnPropertyChanged(System.Windows.DependencyObject d, System.Windows.DependencyPropertyChangedEventArgs e) + 0x58b bytes    
System.Windows.dll!System.Windows.DependencyObject.RaisePropertyChangeNotifications(System.Windows.DependencyProperty dp, object oldValue, object newValue) + 0x53 bytes    
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyProperty property, System.Windows.EffectiveValueEntry oldEntry, ref System.Windows.EffectiveValueEntry newEntry, System.Windows.DependencyObject.ValueOperation operation) + 0xf3 bytes    
System.Windows.dll!System.Windows.DependencyObject.RefreshExpression(System.Windows.DependencyProperty dp) + 0x47 bytes 
System.Windows.dll!System.Windows.Data.BindingExpression.SendDataToTarget() + 0xff bytes    
System.Windows.dll!System.Windows.Data.BindingExpression.SourceAcquired() + 0x5f bytes  
System.Windows.dll!System.Windows.Data.Binding.EnsureBreakPoint(System.Windows.Data.Debugging.BindingDebugState debugState, System.Action callback, bool canDelay) + 0x47 bytes 
System.Windows.dll!System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(object sender, System.Windows.DataContextChangedEventArgs e) + 0xa4 bytes  
System.Windows.dll!System.Windows.Data.BindingExpression.DataContextChanged(object sender, System.Windows.DataContextChangedEventArgs e) + 0xc bytes    
System.Windows.dll!System.Windows.FrameworkElement.OnDataContextChanged(System.Windows.DataContextChangedEventArgs e) + 0x1e bytes  
System.Windows.dll!System.Windows.FrameworkElement.OnAncestorDataContextChanged(System.Windows.DataContextChangedEventArgs e) + 0x26 bytes  
System.Windows.dll!System.Windows.FrameworkElement.NotifyDataContextChanged(System.Windows.DataContextChangedEventArgs e) + 0xcb bytes  
System.Windows.dll!System.Windows.FrameworkElement.OnTreeParentUpdated(System.Windows.DependencyObject newParent, bool bIsNewParentAlive) + 0x3d bytes  
System.Windows.dll!System.Windows.DependencyObject.UpdateTreeParent(MS.Internal.IManagedPeer oldParent, MS.Internal.IManagedPeer newParent, bool bIsNewParentAlive, bool keepReferenceToParent) + 0x4a bytes    
System.Windows.dll!MS.Internal.FrameworkCallbacks.ManagedPeerTreeUpdate(System.IntPtr oldParentElement, System.IntPtr parentElement, System.IntPtr childElement, byte bIsParentAlive, byte bKeepReferenceToParent, bool canCreateParent) + 0xf8 bytes   
[Managed to Native Transition]  
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement element, System.Windows.Size availableSize) + 0x62 bytes 
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size availableSize) + 0x18 bytes  
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget, float inWidth, float inHeight, out float outWidth, out float outHeight) + 0x9e bytes 
[Managed to Native Transition]  
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement element, System.Windows.Size availableSize) + 0x62 bytes 
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size availableSize) + 0x18 bytes  
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget, float inWidth, float inHeight, out float outWidth, out float outHeight) + 0x9e bytes 
[Appdomain Transition]  

person Ivan Crojach Karačić    schedule 27.04.2012    source источник


Ответы (2)


Исключение указывает, что что-то повредило неуправляемую память. Повреждение часто происходит в какой-то момент до того, как будет создано исключение, что затрудняет устранение проблемы. Спиннер может быть вообще не задействован, а просто является вестником более зловещей проблемы в вашем приложении.

Честно говоря, я могу придумать только один способ повредить неуправляемую память в Silverlight, а именно использовать P/Invoke в Silverlight 5. Если вы делаете это, вам следует внимательно изучить эту часть вашего кода.

Приведения в вопросе никоим образом не вредны. В худшем случае отсутствующий или неправильный элемент управления может вызвать NullReferenceException, но это не повредит неуправляемую память.


Если вы хотите улучшить приведение (что не решит вашу проблему), вы можете использовать метод расширения, чтобы выполнить некоторую проверку и сообщить вам, есть ли проблема:

static class FrameworkElementExtensions {

  public T FindName<T>(this FrameworkElement parent, String name) {
    var child = parent.FindName(name);
    if (child == null)
      throw new ArgumentException(
        String.Format("No element named '{0}' exists.", name);
    var typedChild = child as T;
    if (typedChild == null)
      throw new ArgumentException(
        String.Format("Named element '{0}' has wrong type.", name);
    return typedChild;
  }

}

Затем вы можете использовать его следующим образом:

dataField.FindName<RadNumericUpDown>("DefinitionScoringPoints").Minimum = 0;

Вам нужно будет реализовать аналогичные методы расширения для конкретных вызовов Telerik.

person Martin Liversage    schedule 27.04.2012

Ну, во-первых, это много Casts для одной строки кода. Каждый тип, приведенный в коде, означает, что вы знаете гораздо больше, чем код, а это плохо. Также есть вероятность, что метод Find может вернуть null

Если вы пытаетесь установить минимальное значение числового счетчика для формы, я бы посоветовал вам сделать это внутри формы — что-то вроде.

DefinitionDetailForm.SetNumericSpinnerMinValue(0);

И SetNumericSpinnerMinValue может иметь логику для установки минимального значения для счетчика с надлежащей проверкой нуля.

Используйте блок try/catch вокруг кода, который, как вы подозреваете, вызывает исключение.

Еще раз - избавьтесь от этих слепков!

person abhilash    schedule 27.04.2012
comment
Спасибо за это... Я попробую... Что касается приведений, мы получили этот код в том виде, в котором он был, от последней команды, которая его написала, и повсюду миллионы таких приведений. Наша цель - преобразовать все в HTML 5 после того, как мы удалим эти ошибки из системы... Еще раз спасибо - person Ivan Crojach Karačić; 27.04.2012