在调用api之前检查是否可以从api调用方法
本文关键字:调用 api 方法 检查 是否 | 更新日期: 2023-09-27 18:17:59
我有以下代码:
var view = ApplicationView.GetForCurrentView();
var runtimeMethods = view.GetType().GetRuntimeMethods();
if (!view.IsFullScreen)
{
var tryEnterFullScreenMode = runtimeMethods.FirstOrDefault(
x => x.Name == "TryEnterFullScreenMode");
tryEnterFullScreenMode?.Invoke(view, null);
}
这会导致我的应用程序变成全屏,但是如果我在windows 8.1 pc上,我不能调用这些方法。在调用方法之前,我如何首先检查这个功能是否可用。我要用#if…#endif吗?基本上,我只想在应用程序运行在可以访问它的机器上(Windows 10操作系统)时使用此代码。
桌面开发不会遭受web开发所经历的碎片化,因此没有特性支持查询,而是库支持/os版本。至少我不知道。
通常做的是
1) 动态加载程序集,基于您正在运行的操作系统系列版本。为此,您需要一些通用的接口包装器,它在内部保存所有"真正的"API调用。
2)为每个不同的操作系统系列提供不同的版本。你需要支持2个代码库。尽管如此,实际上不同的代码可能会被移动到单独的程序集,因此您只有一小部分不同系列操作系统之间不同的程序集。这对打补丁很有好处,因为只有相对少量的数据需要移动到客户机。这里仍然需要通用接口。
所以你必须找到答案的基本问题不是:如何处理多样性,而是,当你发现你需要做一些与预期不同的事情时,你应该怎么做。从这一点上你可以了解最可靠的方式,你将处理它。
基本上可以在Windows 8.1系统上使用这些代码。在Windows 10中将设置tryEnterFullScreenMode。在Windows 8.1中,它将为空。只有当方法设置为
时才调用该方法:var view = ApplicationView.GetForCurrentView();
TypeInfo t = typeof(ApplicationView).GetTypeInfo();
var tryEnterFullScreenMode = t.GetDeclaredMethod("TryEnterFullScreenMode");
if (tryEnterFullScreenMode != null)
{
tryEnterFullScreenMode.Invoke(view, null);
}
Windows 10引入了适当的功能支持,所以你不会依赖于反射。你可以用Windows.Foundation.Metadata.ApiInformation来检查合约或API是否存在。这允许检查特定于设备或版本的功能,然后如果它们存在,可以使用正常语法(而不是反射语法)轻松调用它们。检查可以基于契约、类型或单个方法、属性或事件:
// Useless example since TryEnterFullScreenMode is in the UniversalApiContract
// and so guaranteed to be there in all Windows 10 apps
bool isEnterFullScreenPresent = Windows.Foundation.Metadata.ApiInformation.IsMethodPresent("Windows.UI.ViewManagement.ApplicationView", "TryEnterFullScreenMode");
if (isEnterFullScreenPresent)
{
ApplicationView.GetForCurrentView().TryEnterFullScreenMode();
}
有关API契约和功能检测的更多信息,请参阅MSDN上的通用Windows平台(UWP)应用指南。