2015-10-16 67 views
4

我有以下代碼:檢查,看是否可以調用來自API的方法調用前

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的電腦我的應用程序變得但是全屏我無法調用這些方法。在調用方法之前,如何首先檢查該功能是否可用。我會用#if ... #endif嗎? 基本上我只想在應用程序在有權訪問的機器上運行時使用此代碼(Windows 10操作系統)。

回答

0

桌面發展不會受到碎片的web開發經驗的遭遇,因此也就不存在功能支持查詢,而庫支持/ OS版本。我至少也不知道。

什麼通常做的是

1)動態裝載組件的基礎上,你正在運行的操作系統家庭版。爲此你需要一些通用的接口包裝器,它包含所有「真正的」API調用。

2)每個都有不同的版本OS系列。您需要支持2個代碼庫。但事實上,實際上不同的代碼可能會移動到單獨的程序集中,因此您只有一小組程序集,這些程序集在不同系列的操作系統之間是不同的。適合修補,因爲只有相對較少的數據必須移動到客戶端。這裏仍然需要通用接口。

所以你必須找到答案的基本問題是:不是如何處理多樣性,而是一旦你發現你需要做一些與預期不同的事情,你應該做什麼。從中你可以理解你將要處理它的最可靠的方式。

0

您基本上可以在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上Guide to Universal Windows Platform (UWP) apps

相關問題