"Überlauf oder Unterlauf in der arithmetischen Operation" WPF-spezifisches Problem

8

Meine WPF-Test-App (sehr einfach, nur ein Fenster) verwendet eine von Drittanbietern gemanagte DLL (etwa X.dll). Diese verwaltete DLL verwendet einige nicht verwaltete DLLs. Also sagen wir, ich schreibe eine kleine wpf-App, die nur auf X.dll verweist. Und im Konstruktor des Fensters greife ich auf etwas innerhalb von X.dll (dh in einigen Namespaces in X.dll). Wenn ich das tue, habe ich keine Ausnahme und es sieht so aus als würden die Dinge wie erwartet ablaufen. Aber nach dem Zurückgeben des Steuerelements an die .NET-Laufzeitumgebung erhalte ich eine Ausnahme im Handler 'DispatcherUnhandledException' der Anwendungsklasse:

"Überlauf oder Unterlauf in der arithmetischen Operation." System.ArithmeticException wurde nicht behandelt Nachricht ="Überlauf oder Unterlauf in der arithmetischen Operation."
Quelle ="PresentationFramework"
StackTrace :

System.Windows.Window.ValidateTopLeft(Double length)
System.Windows.Window.CoerceTop(DependencyObject d, Object value) System.Windows.DependencyObject.ProcessCoerceValue(DependencyProperty dp, PropertyMetadata metadata, EntryIndex& entryIndex, Int32& targetIndex, EffectiveValueEntry& newEntry, EffectiveValueEntry& oldEntry, Object& oldValue, Object baseValue, CoerceValueCallback coerceValueCallback, Boolean coerceWithDeferredReference, Boolean skipBaseValueChecks)
System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, OperationType operationType)
System.Windows.DependencyObject.CoerceValue(DependencyProperty dp) at System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
System.Windows.Window.CreateSourceWindowImpl() at System.Windows.Window.SafeCreateWindow() at System.Windows.Window.ShowHelper(Object booleanBox)
System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

Einige Punkte:

  • Dies tritt nur in der WPF-App und nicht in der winforms-App auf.
  • Das wird nicht in einem Versuch gefangen. nur in DispatcherUnhandledException der Anwendung
  • Dies passiert nicht, wenn ich auf den Code von X.dll innerhalb des "Loaded" -Ereignisses des Fensters zugreife, geschieht nur im Konstruktor.

Kann jemand das Problem erraten?

Danke, Mishal

    
mishal153 09.03.2010, 06:23
quelle

3 Antworten

5

Ich bin mir der Ursache noch nicht sicher, aber die Lösung ist hier:
Ссылка

Scheint ein beliebter Bug zu sein:)

danke, Mishal

    
mishal153 22.03.2010, 10:36
quelle
10

Nach dem Link von @Mishhl ist das Update

%Vor%

Es wird durch etwas in einer enthaltenen DLL verursacht, das den FP in einen Zustand zurücksetzt, der nicht mit WPF / C # / Microsoft DLLs kompatibel ist. Delphi / CPPB tut dies standardmäßig.

Also entweder im Fensterkonstruktor oder im App () - Konstruktor tun Sie einfach

%Vor%

Sie müssen möglicherweise Folgendes ändern, um auf eine Version von msvcr ###. dll

zu verweisen %Vor%

z.B.

%Vor%     
Richard Harrison 01.11.2013 07:07
quelle
0

Wenn es helfen kann, hatte ich genau das gleiche Problem (wie hier und hier ). Ich bringe hier eine der möglichen Ursachen dafür.

Ich verwende einen ElementHost (c #, .net4.0, winform, VS2012) für ein großartiges WPF UserControl. Alles hat gut funktioniert . In meinem UserControl-Behind-Code verwendete ich eine Klasse, die von einer anderen DLL kam, um den Fortschritt bestimmter Aufgaben zu speichern. Zum Beispiel (es ist nah an der Realität):

%Vor%

Ich wollte dann diese Klasse in meine WPF progressBar / textBox "stecken", um den Fortschritt zu melden. Wie auch immer (und das ist eine weitere Konversation), WPF muss INotifyPropertyChanged auf jede einzelne Eigenschaft angewendet haben, die Sie in WPF einfügen möchten (um die Steuerelemente in WPF automatisch zu aktualisieren). Das ist eines der hässlichsten Dinge, die ich je gesehen habe, aber es ist was es ist (Und ich weiß, ich muss etwas verpasst haben ..)

Wie auch immer, um WPF-Binding-Mechanismen zwischen meiner ProgressBar / textbox und meiner SI_MyProgressionHelper-Klasse zu erfüllen, habe ich die Klasse (was ich wiederholen möchte, ist in einer anderen DLL) dazu geändert:

%Vor%

BAM! Der Fehler tritt bei jeder zufälligen Integer-Eigenschaft eines beliebigen XMLE-Elements (Höhe, Breite usw.) meines UserContrl auf (genau wie hier und in der anderen Referenz, die ich oben angegeben habe).

Die hier eingebrachte Lösung korrigiert mein Problem: In meiner Main () - Methode Program.cs:

%Vor%

und dann in meinem UserControl.xaml.cs im Konstruktor:

%Vor%

Außerdem, und das ist der Grund, warum ich diesen Kommentar geschrieben habe : Durch Entfernen des INotifyPropertyChanged in meiner Helper-Klasse (und anderen Dingen), verschwindet das Problem . (aber mein WPF ist traurig, weil mein Code für ihn zu kurz ist).

Ich hoffe, diese zusätzlichen Informationen können dazu beitragen, dass jemand das gleiche Problem hat.

Auch für meinen französischen Kollegen ist hier der französische Fehler aufgetreten:

  

Es ist eine unausweichliche Entwicklung der Kapazitäten, die sich positiv oder negativ auswirken   l'opération arithmétique.

    
Simon 10.02.2015 15:05
quelle

Tags und Links