检查是否可以在调用api之前调用api中的方法

时间:2015-10-16 16:52:52

标签: c# windows-runtime

我有以下代码:

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操作系统)。

2 个答案:

答案 0 :(得分:0)

桌面开发不受Web开发所遇到的碎片影响,因此没有功能支持查询,而是库支持/ os版本。至少我也不知道。

通常做的是

1)动态加载程序集,基于您运行的OS系列版本。为此,您需要一些通用的界面包装器,它可以在内部隐藏所有“真正的”API调用。

2)为每个不同的 OS系列提供不同的版本。您需要支持2个代码库。但事件中,实际不同的代码可能会被移动到单独的程序集中,因此您只有一小组程序集,这些程序集在不同的OS系列之间是不同的。适合修补,因为只需要将相对少量的数据移动到客户端。这里还需要常见的界面。

所以你必须找到答案的基本问题是:不是如何处理多样性,而是一旦你发现你需要做一些与预期不同的事情,你应该做些什么。从那里你可以理解你将要处理的最可靠的方式。

答案 1 :(得分:0)

您可以在Windows 8.1系统上使用该代码。在Windows 10上将设置tryEnterFullScreenMode。在Windows 8.1上,它将为null。仅在设置方法时调用该方法:

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上的Guide to Universal Windows Platform (UWP) apps