差分

ナビゲーションに移動 検索に移動

Xamarin.MacでMac本体のシリアル番号を取得する

2,555 バイト追加, 2016年11月14日 (月) 05:00
ページの作成:「Xamarin.MacでSMCKitを使いたくてその大元となるIOKitの使い方を調べていたら拾った。 最終的には「IOConnectCallStructMethod」を使いた...」
Xamarin.MacでSMCKitを使いたくてその大元となるIOKitの使い方を調べていたら拾った。
最終的には「IOConnectCallStructMethod」を使いたいわけだが、そこまでたどりつけないので途中経過で得たものをメモしておく。

== 実装 ==
リンゴマークの「このMacについて」で表示される「シリアル番号」がコンソールに表示されるだけのサンプル。

<source lang="csharp">
using Foundation;
using AppKit;

namespace SMCKitSample
{
static class MainClass
{
[DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
static extern uint IOServiceGetMatchingService(IOMasterPort masterPort, IntPtr matching);

[DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
static extern IntPtr IOServiceMatching(string s);

[DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
static extern IntPtr IORegistryEntryCreateCFProperty(uint entry, IntPtr key, IntPtr allocator, uint options);

[DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
static extern int IOObjectRelease(uint o);

public enum IOMasterPort : uint
{
Default = 0,
};

public static string GetSerialNumber()
{
string serialNumber = string.Empty;
uint service = 0;

try
{
IntPtr matching = IOServiceMatching("IOPlatformExpertDevice");
service = IOServiceGetMatchingService(IOMasterPort.Default, matching);
if (service == 0)
{
return string.Empty;
}

NSString key = (NSString)"IOPlatformSerialNumber";
IntPtr serialHandle = IORegistryEntryCreateCFProperty(service, key.Handle, IntPtr.Zero, 0);
if (serialHandle != IntPtr.Zero)
{
serialNumber = NSString.FromHandle(serialHandle);
}
}
finally
{
if (service != 0)
{
IOObjectRelease(service);
}
}

return serialNumber;
}

public static void Main(string[] args)
{
NSApplication.Init();
Console.WriteLine(GetSerialNumber());
}
}
}
</source>

== 関連項目 ==
* [[Xamarin.Mac/ディスプレイのスリープを解除する]]

== 参考文献 ==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー