8

Ten kod działa dobrze w moim app WP8:Jak mogę uzyskać informacje o tytule i wersji aplikacji Windows Store?

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); 
} 

... ale w moim app store komplementarnego systemu Windows, kilka klas i członkowie klasy są nierozpoznane, a mianowicie:

XmlResolver 
XmlXapResolver 
args.ExceptionObject 

(nie wspomnieć o tym, że oczekiwanie jest niedozwolone, a dodanie "asynchronicznej" do obsługi zdarzenia powoduje przypisanie programu obsługi zdarzeń do "przejścia na czerwony") ...

Aby wrócić do głównego punktu: Jak można Osiągam tę samą funkcjonalność, którą uzyskuję w mojej aplikacji WP8 z moją aplikacją Windows Store?

Odpowiedz

17

Pozwól mi najpierw rozwiązać swoje problemy:

  • Nie ma potrzeby, aby odczytać informacje bezpośrednio z pakietu XML, można użyć zamiast PackageId class.
  • Informacje o wyjątkach są przechowywane w args.Exception.
  • Możesz wywołać metody asynchroniczne z obsługi zdarzenia, umieszczając async void w sygnaturze metody, ale musisz pamiętać, że metoda zostanie wywołana w trybie "ogień i zapomnij", tzn. Aplikacja nie będzie czekać na metodę asynchroniczną do ukończenia. Nie powinno to stanowić problemu, jeśli ustawisz args.Handled = true, co uniemożliwi zamknięcie aplikacji.

Twój stałej obsługi zdarzenia powinny wyglądać następująco:

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); 
} 

Należy również sprawdzić, czy args.Exception.InnerException jest null, przed wywołaniem ToString() na nim.

+0

+1 od tej odpowiedzi i jej sprytnego wykorzystania nowych funkcji API Package.Current. – JustinAngel

+1

'Package.Current.Id' podnosi' NotImplementedException' na Windows Phone 8 –

+1

@ Cœur Dla Windows Phone 8 powinieneś się tak postąpić. 'Wersja String = XDocument.Load (" WMAppManifest.xml ") .Rozmiar.Rozliczenie (" Aplikacja ") Atrybut (" Wersja ") Wartość;' –

Powiązane problemy