【问题标题】:How can I get my Windows Store app's title and version info?如何获取我的 Windows 应用商店应用的标题和版本信息?
【发布时间】:2012-12-31 12:45:10
【问题描述】:

这段代码在我的 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

(更不用说 await 是不允许的,在事件处理程序中添加“async”会导致事件处理程序的分配“变红”)...

所以,回到重点:我如何才能通过我的 WP8 应用程序和我的 Windows 应用商店应用程序实现相同的功能?

【问题讨论】:

    标签: c# exception-handling xml-parsing windows-phone-8 windows-store-apps


    【解决方案1】:

    让我先解决您的问题:

    • 无需直接从 XML 读取包信息,您可以使用 PackageId class 代替。
    • 异常信息存储在args.Exception
    • 您可以通过将async void 放在方法签名中来从事件处理程序调用异步方法,但您必须记住该方法将在“即发即弃”模式下调用,即应用程序不会等待异步方法来完成。如果您设置 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 是否为空。

    【讨论】:

    • +1 对此答案及其对新 Package.Current API 的巧妙使用。
    • Package.Current.Id 在 Windows Phone 8 上引发 NotImplementedException
    • @Cœur 对于 windows phone 8,你应该得到这样的。 String version= XDocument.Load("WMAppManifest.xml").Root.Element("App").Attribute("Version").Value;
    • MSFT 文档:“Windows Phone 8:此 API 未实现,如果调用将引发异常。”此外,我不希望在未处理的异常处理程序中使用异步:当系统仍然工作时,您最好尽快写下错误,下一个等待/异步滴答可能不会出现。
    猜你喜欢
    • 2016-07-25
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 2012-12-08
    相关资源
    最近更新 更多