8

Bu kod benim WP8 app çalışıyor:Windows Mağazası uygulamasının başlık ve sürüm bilgilerini nasıl edinebilirim?

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

... ama benim tamamlayıcı, Windows mağaza uygulamasında, çeşitli sınıflar ve sınıf üyeleri demek ki, tanınmayan şunlardır:

XmlResolver 
XmlXapResolver 
args.ExceptionObject 

(değil beklemeye izin verilmediğinden ve olay işleyicisine "async" eklendiğinden, olay işleyicisinin "kırmızıya gitmesi" nedenine neden olduğu belirtiliyor ...

Ana noktaya geri dönmek için: WP8 uygulamamla aynı işlevi alıyorum Windows Mağazası uygulamam ile

cevap

17

beni ilk konuları ele alalım: XML doğrudan paket bilgi okumak için gerek yoktur

  • , bunun yerine PackageId class kullanabilirsiniz.
  • İstisna bilgisi args.Exception'da saklanır.
  • Yöntem işleyicisine async void kodunu koyarak olay işleyicisinden eşzamansız yöntemleri çağırabilirsiniz, ancak yöntemin "yangın ve unut" modunda çağrılacağını, yani uygulamanın eşzamansız yöntem için beklemeyeceğini unutmayın. tamamlamak için args.Handled = true ayarlayın ve böylece uygulamanın kapanmasını engellerseniz bu bir sorun olmamalıdır.

Kişisel sabit olay işleyicisi aşağıdaki gibi görünmelidir: args.Exception.InnerException Üzerinde ToString() çağırmadan önce, null ise

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

Ayrıca kontrol etmelisiniz. Bu yanıtta ve yeni Package.Current API'lerinin dikkat çekici kullanımıyla ilgili

+0

+1. – JustinAngel

+1

'Package.Current.Id', Windows Phone 8'de NotImplementedException'ı yükseltir 8 –

+1

@ Cœur Windows Phone 8 için, bunun gibi olmanız gerekir. 'Dize sürümü = XDocument.Load (" WMAppManifest.xml "). Root.Element (" Uygulama "). Attribute (" Sürüm "). Değer; –

İlgili konular