「Xamarin.MacでOSのバージョンを取得する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「==概要== Xamarin.Macに存在しない標準ライブラリをCocoa BindingP/Invoke)で叩く際にはOSのバージョンによりAPIがあっ...」)
 
(Administrator がページ「Xamarin.Mac/OSのバージョンを取得する」を「Xamarin.MacでOSのバージョンを取得する」に移動しました)
 
(3人の利用者による、間の3版が非表示)
1行目: 1行目:
 
==概要==
 
==概要==
[[Xamarin.Mac]]に存在しない標準ライブラリを[[Cocoa Binding]]([[P/Invoke]])で叩く際には[[OS]]のバージョンにより[[API]]があったりなかったりして[[条件分岐]]に迫られる。
+
[[Xamarin.Mac]]に存在しない標準ライブラリを[[P/Invoke]]で叩く際には[[OS]]のバージョンにより[[API]]があったりなかったりして[[条件分岐]]に迫られることが多い。
基本的に[[Mac OS X]]は[[Windows]]のように古いAPIも継続して使えるなどという軟弱な仕様ではない。
+
基本的に[[MacOS]]は[[Windows]]のように古いAPIも継続して使えるなどという軟弱な仕様ではない。
良くも悪くも代謝を施し市場活性化のためにバッサリ切り捨てである。
+
MacOSは良くも悪くも代謝を施し市場活性化のためにバッサリ切り捨てが頻繁に起きる。
 +
そのためバージョンを取得する手段が重要になってくる。
  
 
==実装:SystemVersion.plistから抜く==
 
==実装:SystemVersion.plistから抜く==
SystemVersion.plistというファイルから抜けるようだ。
+
/System/Library/CoreServices/SystemVersion.plistというファイルから抜けるようだ。
 
<source lang="csharp">
 
<source lang="csharp">
            var version = NSDictionary.FromFile(@"/System/Library/CoreServices/SystemVersion.plist");
+
var version = NSDictionary.FromFile(@"/System/Library/CoreServices/SystemVersion.plist");
            Console.WriteLine(version);
+
Console.WriteLine(version);
 
</source>
 
</source>
  
22行目: 23行目:
 
</source>
 
</source>
  
XamarinのNSDictionaryはIDictionaryを実装しているので以下のように手軽にアクセスできる。
+
[[Xamarin]]のNSDictionaryはIDictionaryを実装しているので以下のように手軽にアクセスできる。
 
<source lang="csharp">
 
<source lang="csharp">
            Console.WriteLine(version["ProductVersion"]);
+
Console.WriteLine(version["ProductVersion"]);
 
</source>
 
</source>
  
 +
[[文字列]]では扱いにくい場合は[[.NET]]標準のVersionクラスを使えばパースも簡単にできる。
 +
<source lang="csharp">
 +
var v = new Version(version["ProductVersion"].ToString());
 +
Console.WriteLine(v.Major);
 +
Console.WriteLine(v.Minor);
 +
Console.WriteLine(v.Build);
 +
</source>
  
 
==実装:NSProcessInfoを使う==
 
==実装:NSProcessInfoを使う==
32行目: 40行目:
 
[[Mac OS X 10.9]]([[Mavericks]])以下は切り捨てるというのであればこの方法が推奨となるようだ。
 
[[Mac OS X 10.9]]([[Mavericks]])以下は切り捨てるというのであればこの方法が推奨となるようだ。
 
<source lang="csharp">
 
<source lang="csharp">
            var version = NSProcessInfo.ProcessInfo.OperatingSystemVersion;
+
var version = NSProcessInfo.ProcessInfo.OperatingSystemVersion;
            Console.WriteLine(version);
+
Console.WriteLine(version);
 
</source>
 
</source>
  
39行目: 47行目:
 
*[[Xamarin.Mac/アクセシビリティの許可の有無を取得する]]
 
*[[Xamarin.Mac/アクセシビリティの許可の有無を取得する]]
 
*[[Xamarin.Mac/Global Event Monitorでキー入力を監視する]]
 
*[[Xamarin.Mac/Global Event Monitorでキー入力を監視する]]
 
==参考文献==
 
{{reflist}}
 
 
{{stub}}
 
  
 
[[category:Xamarin.Mac]]
 
[[category:Xamarin.Mac]]
 
[[category:MonoMac]]
 
[[category:MonoMac]]

2019年12月25日 (水) 08:08時点における最新版

概要[編集 | ソースを編集]

Xamarin.Macに存在しない標準ライブラリをP/Invokeで叩く際にはOSのバージョンによりAPIがあったりなかったりして条件分岐に迫られることが多い。 基本的にMacOSWindowsのように古いAPIも継続して使えるなどという軟弱な仕様ではない。 MacOSは良くも悪くも代謝を施し市場活性化のためにバッサリ切り捨てが頻繁に起きる。 そのためバージョンを取得する手段が重要になってくる。

実装:SystemVersion.plistから抜く[編集 | ソースを編集]

/System/Library/CoreServices/SystemVersion.plistというファイルから抜けるようだ。

var version = NSDictionary.FromFile(@"/System/Library/CoreServices/SystemVersion.plist");
Console.WriteLine(version);

上記で取得したNSDictionaryの中身は以下のような感じになっている。

{
    ProductBuildVersion = 14F27;
    ProductCopyright = "1983-2015 Apple Inc.";
    ProductName = "Mac OS X";
    ProductUserVisibleVersion = "10.10.5";
    ProductVersion = "10.10.5";
}

XamarinのNSDictionaryはIDictionaryを実装しているので以下のように手軽にアクセスできる。

Console.WriteLine(version["ProductVersion"]);

文字列では扱いにくい場合は.NET標準のVersionクラスを使えばパースも簡単にできる。

var v = new Version(version["ProductVersion"].ToString());
Console.WriteLine(v.Major);
Console.WriteLine(v.Minor);
Console.WriteLine(v.Build);

実装:NSProcessInfoを使う[編集 | ソースを編集]

NSProcessInfoからバージョン情報を取得する方法はMac OS X 10.10Yosemite)以上でしか使えないが、iOSでも共通で使えるという利点がある。 Mac OS X 10.9Mavericks)以下は切り捨てるというのであればこの方法が推奨となるようだ。

var version = NSProcessInfo.ProcessInfo.OperatingSystemVersion;
 Console.WriteLine(version);

関連項目[編集 | ソースを編集]