【问题标题】:Determine if C# application is running as a UWP app in Desktop Bridge (Project Centennial)确定 C# 应用程序是否在桌面桥(Project Centennial)中作为 UWP 应用程序运行
【发布时间】:2017-12-18 22:29:45
【问题描述】:

如何检查应用程序是否作为 UWP 运行?

Almost the same question,但我需要它用于 C#,而不是 C++。

如果我尝试获取 ApplicationData.Current.LocalFolder 并且应用程序作为 Win32 应用程序运行,则会引发异常:

“System.InvalidOperationException”类型的未处理异常 发生在 applcation.exe 附加信息:该进程没有 包标识。 (来自 HRESULT 的异常:0x80073D54)发生

如何无一例外地检查应用类型?

【问题讨论】:

  • 当您坐在机器前时,没有任何方法可以让您知道。您必须选择正确的项目模板,也许启用桌面桥,将应用程序上传到商店。当您坐在那台机器前时,一件显而易见的事情是编辑项目 > 属性 > 构建选项卡 > 条件编译符号设置。
  • @HansPassant,实际上,我想做的是:almost the same question 但仅适用于 C#
  • 请务必不要提及您使用桥接器,您不想让任何人轻松帮助您。
  • @HansPassant,更改标题并添加标签
  • 您可以P/Invoke相关问题中列出的API。

标签: c# uwp runtime desktop-bridge


【解决方案1】:

您可以使用 P/Invoke 在 C# 中调用 GetCurrentPackageFullName 方法。有一个 DesktopBridge.Helpers 包,您可以使用它来为您执行此操作。它也适用于 Windows 7。

DesktopBridge.Helpers helpers = new DesktopBridge.Helpers(); 
bool isUwp = helpers.IsRunningAsUwp(); 

有兴趣的可以看这里是如何实现的:https://github.com/qmatteoq/DesktopBridgeHelpers/blob/master/DesktopBridge.Helpers/Helpers.cs

这里是 Nuget 包: https://www.nuget.org/packages/DesktopBridge.Helpers/

【讨论】:

  • 是的,写在这个article,链接来自this answer
  • "在 Windows 7、Vista 甚至 XP 上使用此代码总是会返回异常",但我们需要 Win7
  • IsRunningAsUwp() 在 Windows 7 及更低版本上返回 false。它不扔。你没试过吗?
【解决方案2】:

您看过这篇 MSDN 文章吗? Desktop Bridge – Identify the application’s context

它有一个示例,显示如何使应用行为不同,具体取决于运行模式(win32 桌面应用程序或桌面桥应用程序)。

【讨论】:

  • 来自这篇文章:我需要使用 P/Invoke 或使用他们的 nuget,它使用 P/Invoke,没有 .NET API 用于此
  • 不,GetCurrentPackageFullName 是非托管方法。没有 .NET 等价物。但同样,您可以使用 P/Invoke 来调用它。
猜你喜欢
  • 2017-01-29
  • 2017-05-14
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多