8

Mã này hoạt động tốt trong ứng dụng của WP8 của tôi:Tôi làm cách nào để có được thông tin về phiên bản và tiêu đề của ứng dụng 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); 
} 

... nhưng trong ứng dụng cửa hàng của Windows bổ sung của tôi, một số lớp học và các thành viên lớp là không được công nhận, để wit:

XmlResolver 
XmlXapResolver 
args.ExceptionObject 

(không đề cập đến thực tế là chờ đợi là không được phép, và thêm "async" để xử lý sự kiện gây ra việc phân công xử lý sự kiện để "đi màu đỏ") ...

Vì vậy, để trở lại điểm chính: Làm thế nào có thể Tôi đạt được cùng chức năng mà tôi nhận được với ứng dụng WP8 của mình với ứng dụng Windows Store của tôi?

Trả lời

17

Hãy đầu tiên tôi giải quyết vấn đề của bạn:

  • Không cần để đọc các thông tin gói trực tiếp từ XML, bạn có thể sử dụng PackageId class để thay thế.
  • Thông tin ngoại lệ được lưu trữ trong args.Exception.
  • Bạn có thể gọi phương thức không đồng bộ từ trình xử lý sự kiện bằng cách đặt async void trong chữ ký phương thức nhưng bạn phải nhớ rằng phương thức sẽ được gọi trong chế độ "lửa và quên", tức là ứng dụng sẽ không chờ phương thức không đồng bộ để hoàn thành. Đây không phải là vấn đề nếu bạn đặt args.Handled = true và do đó ngăn ứng dụng đóng.

xử lý sự kiện cố định của bạn sẽ trông như thế này:

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

Bạn cũng nên kiểm tra xem args.Exception.InnerException là null, trước khi gọi ToString() trên đó.

+0

+1 về câu trả lời này và việc sử dụng khôn ngoan các API Package.Current mới. – JustinAngel

+1

'Package.Current.Id' tăng' NotImplementedException' trên Windows Phone 8 –

+1

@ Cœur Đối với windows phone 8, bạn nên có được như thế này. 'Chuỗi phiên bản = XDocument.Load (" WMAppManifest.xml ") Root.Element (" Ứng dụng "). Thuộc tính (" Phiên bản ") Giá trị;' –

Các vấn đề liên quan