2016-04-15 6 views
0

Meine Anwendung läuft auf Windows Embedded Standard 7 und startet, wenn das Betriebssystem hochfährt.Ereignisanzeige, die meine C# -Anwendung meldet, stürzte durch 'System.Environment.FailFast()'

Manchmal auf der ersten Last, ich werde ein Unknown Hard Error, erhalten und nach der Ereignisanzeige überprüft, sehe ich eine Nachricht von

The application requested process termination through System.Environment.FailFast(string message). 
Message: Unrecoverable system error. 

Unnötig zu sagen, habe ich natürlich keine Anrufe an diese Funktion. Ich scheine nur zu sehen, dass dies auf Windows Embedded geschieht, und habe dies bei einer Standardinstallation von Windows nicht gesehen.

Ich bin mir nicht sicher, wie das zu diagnostizieren ist oder was "reparieren" wäre angemessen, da ich nicht wirklich weiß, warum es passiert.

Edit:

Das gesamte Protokoll in der Ereignisanzeige:

Application: WinForm.exe 
    Framework Version: v4.0.30319 
    Description: The application requested process termination through System.Environment.FailFast(string message). 
    Message: Unrecoverable system error. 
    Stack: 
     at System.Environment.FailFast(System.String) 
     at MS.Internal.Invariant.FailFast(System.String, System.String) 
     at System.IO.Packaging.Package.AddIfNoPrefixCollisionDetected(ValidatedPartUri,  
System.IO.Packaging.PackagePart) at System.IO.Packaging.Package.GetPartHelper(System.Uri) 
    at System.IO.Packaging.Package.GetPart(System.Uri) 
    at System.Windows.Application.GetResourceOrContentPart(System.Uri) 
    at System.Windows.Application.LoadComponent(System.Object, System.Uri) 
    at Pms.PmControl.InitializeComponent() 
    at Pms.PmControl..ctor(Boolean) 
    at Pms.PmAppControl.StartWpfThread() 
    at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ThreadHelper.ThreadStart() 
+0

Sieht so aus, als könnten Sie eine Dump-Datei erhalten, wenn der Pfad [in der Registrierung] konfiguriert ist (http://stackoverflow.com/questions/7808541/where-is-the-application-dump-created-by-environment- failfast-located-on-the-d). Stellt der Ereignis-Viewer auch den Stapel bereit? Es wäre hilfreich, den Stack-Trace zu sehen. – Quantic

+0

Es hat den Stack-Trace im Ereignisprotokoll, aber leider gibt es nichts, das von jedem Anruf stammt, den ich mache. Der gesamte Stack-Trace ist ein interner .NET-Aufruf, der 'FailFast' aufruft. Ich werde versuchen, in der Stack-Spur zu bearbeiten. – pay

+0

Ich habe gelogen da sind ein paar meiner Anrufe drin. – pay

Antwort

1

Wenn Sie mit einem Decompiler auf den Code schauen, werden Sie finden

// System.IO.Packaging.Package 
private void AddIfNoPrefixCollisionDetected(PackUriHelper.ValidatedPartUri partUri, PackagePart part) 
{ 
    this._partList.Add(partUri, part); 
    int num = this._partList.IndexOfKey(partUri); 
    Invariant.Assert(num >= 0, "Given uri must be present in the dictionary");** 
    string normalizedPartUriString = partUri.NormalizedPartUriString; 
    string text = null; 
    string text2 = null; 
    if (num > 0) 
    { 
     text = this._partList.Keys[num - 1].NormalizedPartUriString; 
    } 
    if (num < this._partList.Count - 1) 
    { 
     text2 = this._partList.Keys[num + 1].NormalizedPartUriString; 
    } 
    if ((text != null && normalizedPartUriString.StartsWith(text, StringComparison.Ordinal) && normalizedPartUriString.Length > text.Length && normalizedPartUriString[text.Length] == PackUriHelper.ForwardSlashChar) || (text2 != null && text2.StartsWith(normalizedPartUriString, StringComparison.Ordinal) && text2.Length > normalizedPartUriString.Length && text2[normalizedPartUriString.Length] == PackUriHelper.ForwardSlashChar)) 
    { 
     this._partList.Remove(partUri); 
     throw new InvalidOperationException(SR.Get("PartNamePrefixExists")); 
    } 
} 

Der Code scheitert an der assert weil das ist die einzige Methode, die FailFast ruft

internal static void Assert(bool condition, string invariantMessage) 
{ 
    if (!condition) 
    { 
     Invariant.FailFast(invariantMessage, null); 
    } 
} 

Nun bleibt die Frage, warum Sie das Paket nicht im PartList-Array gefunden haben. WPF füllt einige Dinge für Sie aus. Könnte es sein, dass Sie von Ihrem XAML eine Ressource über eine Internetadresse oder eine Netzwerkfreigabe referenzieren, die fehlschlagen könnte, wenn das Netzwerksubsystem Ihres Windows Embedded noch nicht bereit ist?

+0

Ich dachte eigentlich etwas in dieser Richtung, vielleicht, wenn ich 10-30 Sekunden Verzögerung vor dem Laden der Software hinzufüge, könnte es dem Betriebssystem mehr Zeit geben, 'bereit' zu sein. Danke für die Informationen, aber ich werde mich umsehen, ob es möglicherweise eine Ressource gibt, die falsch oder etwas seltsam ist. Ich dachte auch darüber nach, dass es einen Dienst geben könnte, der nicht rechtzeitig startet, damit meine Software richtig geladen wird. – pay