8

Dieser Code funktioniert in meiner WP8 App fein:Wie kann ich den Titel und die Versionsinformationen meiner Windows Store-App abrufen?

void App_UnhandledException(object sender, UnhandledExceptionEventArgs args) 
{ 
    string appName; 
    string appVersion; 
    var xmlReaderSettings = new XmlReaderSettings 
    { 
     XmlResolver = new XmlXapResolver() 
    }; 

    using (var xmlReader = XmlReader.Create("WMAppManifest.xml", xmlReaderSettings)) 
    { 
     xmlReader.ReadToDescendant("App"); 

     appName = xmlReader.GetAttribute("Title"); 
     appVersion = xmlReader.GetAttribute("Version"); 
    } 

    WAMS_EXCEPTIONLOG wamsel = new WAMS_EXCEPTIONLOG 
    { 
     appNameAndVersion = 
      string.Format("{0} {1}", appName, 
          appVersion), 
     ExceptionMsg = 
      args.ExceptionObject.Message, 
     InnerException = 
      args.ExceptionObject 
       .InnerException.ToString(), 
     ExceptionToStr = 
      args.ExceptionObject.ToString(), 
     dateTimeOffsetStamp = 
      DateTimeOffset.UtcNow 
    }; 
    await MobileService.GetTable<TASLS_WAMS_EXCEPTIONLOG>().InsertAsync(wamsel); 
} 

... aber in meiner komplementär Windows Store App, sind mehrere Klassen und Klassenmitglieder unerkannt, nämlich:

XmlResolver 
XmlXapResolver 
args.ExceptionObject 

(nicht zu Erwähnen Sie die Tatsache, dass "erwarten" nicht erlaubt ist, und das Hinzufügen von "async" zum Ereignishandler verursacht die Zuweisung des Ereignishandlers zu "go red") ...

Also, um zurück zum Hauptpunkt: Wie kann Ich erreiche die gleiche Funktionalität, die ich mit meiner WP8-App bekomme mit meiner Windows Store App?

Antwort

17

Lassen Sie mich zuerst die Probleme anzugehen:

  • Es gibt keine Notwendigkeit besteht, die Paketinformationen direkt von XML zu lesen, können Sie die PackageId class stattdessen verwenden können.
  • Exception-Informationen werden in args.Exception gespeichert.
  • Sie können asynchrone Methoden vom Event-Handler aufrufen, indem Sie async void in die Methodensignatur setzen, aber Sie müssen daran denken, dass die Methode im "fire and forget" -Modus aufgerufen wird, dh die App nicht auf die asynchrone Methode wartet zu vervollständigen. Das sollte kein Problem sein, wenn Sie args.Handled = true festlegen und so verhindern, dass die App geschlossen wird.

Ihre festen Event-Handler sollte wie folgt aussehen:

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs args) 
{ 
    string appName = Package.Current.Id.Name; 
    var version = Package.Current.Id.Version; 
    string appVersion = String.Format("{0}.{1}.{2}.{3}", 
     version.Major, version.Minor, version.Build, version.Revision); 

    WAMS_EXCEPTIONLOG wamsel = new WAMS_EXCEPTIONLOG 
    { 
     appNameAndVersion = string.Format("{0} {1}", appName, appVersion), 
     ExceptionMsg = args.Exception.Message, 
     InnerException = args.Exception.InnerException.ToString(), 
     ExceptionToStr = args.Exception.ToString(), 
     dateTimeOffsetStamp = DateTimeOffset.UtcNow 
    }; 
    args.Handled = true; 
    await MobileService.GetTable<TASLS_WAMS_EXCEPTIONLOG>().InsertAsync(wamsel); 
} 

Sie sollten auch prüfen, ob args.Exception.InnerException null ist, bevor ToString() forderte sie auf.

+0

+1 auf diese Antwort und ihre schlaue Verwendung der neuen Package.Current APIs. – JustinAngel

+1

'Paket.Current.Id' löst 'NotImplementedException' auf Windows Phone 8 –

+1

@ Cœur Für Windows Phone 8, sollten Sie so bekommen. 'String-Version = XDocument.Load (" WMAppManifest.xml "). Root.Element (" App "). Attribut (" Version "). Value;' –

Verwandte Themen