如何获取我的Windows商店应用程序的标题和版本信息?

8

这段代码在我的WP8应用程序中运行良好:

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

...但是在我的补充Windows商店应用程序中,有几个类和类成员无法识别,即:

XmlResolver
XmlXapResolver
args.ExceptionObject

不仅仅是等待操作不被允许,而且将“async”添加到事件处理程序会导致事件处理程序的赋值变成“红色”。回归主题:我如何在Windows商店应用程序中实现与我的WP8应用程序相同的功能?请指教。
1个回答

17

首先,我来回答你的问题:

  • 没有必要直接从XML中读取包信息,您可以使用PackageId类
  • 异常信息存储在args.Exception中。
  • 您可以通过在方法签名中加入async void来从事件处理程序中调用异步方法,但是您必须注意,该方法将以“fire and forget”模式调用,即应用程序不会等待异步方法完成。如果您设置args.Handled = true,从而防止应用程序关闭,则这不应该成为问题。

您修复后的事件处理程序应如下所示:

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

在调用ToString()之前,您还应检查args.Exception.InnerException是否为null。


对这个答案和其巧妙使用新的 Package.Current API 点一个赞。 - JustinAngel
1
在Windows Phone 8上,Package.Current.Id会引发NotImplementedException异常。 - Cœur
1
对于Windows Phone 8,您应该像这样获取:String version= XDocument.Load("WMAppManifest.xml").Root.Element("App").Attribute("Version").Value; - user2745378
微软文档:“Windows Phone 8:此API未实现,如果调用将引发异常。” 此外,我不建议在未处理的异常处理程序中使用async:虽然系统仍然可以工作,但最好尽快记录错误,下一个await/async可能不会出现。 - Tertium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接