我有一个 .NET 5 控制台应用程序,我在文档“.NET 5:使用目标框架名字对象选项”之后使用了该应用程序。这意味着我的项目文件目前看起来像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0-windows10.0.18362</TargetFramework>
</PropertyGroup>
</Project>
然后我尝试使用new Geolocator().GetGeopositionAsync()
按预期工作的 Location Api。据我了解,只有当我的应用程序具有包标识时,我才能使用某些 UWP API。所以我创建了一个应用程序打包项目,将我的控制台应用程序引用为应用程序。我按照文档将整个项目打包为 msix 包。现在效果很好,我仍然可以按预期访问当前的地理位置。
但是,我遵循了在 UWP 中设置地理围栏的文档,一旦我尝试注册地理围栏甚至为触发的地理围栏注册事件处理程序,我就会得到一个
One or more errors occurred. (Access is denied. (0x80070005 (E_ACCESSDENIED)))
例外。我在清单文件中的功能定义如下:
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="runFullTrust" />
<DeviceCapability Name="location"/>
</Capabilities>
在我尝试设置地理围栏或注册事件处理程序之前,我总是调用await Geolocator.RequestAccessAsync()
并且只有在此方法每次都返回 Allowed 时才继续执行该操作。这意味着这个问题的答案对我没有帮助。
是否有可能确保我定义能力的方式没有问题?例如,有没有办法在运行时检查我的能力?到目前为止,我没有找到关于该主题的任何内容。或者我的主要假设是否存在问题,即一旦我的控制台应用程序具有包 ID,因为它被打包为 msix,我就可以访问我无法访问的地理围栏等功能?
在检查了我是否可以通过调用 I 访问该位置之后,await Geolocator.RequestAccessAsync()
例如尝试执行以下代码:
GeofenceMonitor.Current.GeofenceStateChanged += this.OnGeofenceStateChanged;
并立即收到异常。
编辑:我现在也尝试在 UWP 应用程序中使用相同的代码。在那里,它就像一个魅力,我注意到我在执行时收到一个弹出窗口,RequestLocation
要求我授予应用程序访问该位置的权限。我从未在我的控制台应用程序中收到过类似的弹出窗口。我认为这可能是因为缺少 UI 线程。
我现在还尝试使用 WPF 应用程序而不是控制台应用程序来测试是否缺少 UI 线程可能是问题所在。但是,我在 WPF 应用程序(当然也打包为 .msix)中遇到了与控制台应用程序相同的问题。