差分

ナビゲーションに移動 検索に移動
'''.NET Core'''とは、2016年6月27日に公開された、[[Windows]]、[[Mac OS X]]、[[Linux]]上で動作する軽量なプラットフォームである。Macに接続されているディスプレイの一覧はCore GraphicsのCGGetOnlineDisplayListメソッドで取得できる。MacBookなどに外部ディスプレイを繋げてクラムシェル(ノートの蓋を閉じて使う)で使っている場合は本体側のディスプレイは結果に含まれない。そこまで取りたい場合について調べていない。
== 概要 ==Xamarin.NET Coreは従来の.NET Frameworkをもとにマルチプラットフォーム対応とそれにともなう最小公倍数的な軽量化が施されたものである。.NET Coreは従来の.NET Frameworkとは決別するという意味を込めてか、バージョンも1.0から仕切り直しとなっており、あくまで別物と考えておくのが無難である。MacでP/Invokeメソッドの引数に配列に渡すときはIntPtrに変換する必要がある点が若干めんどくさい。
従来の<source lang="csharp">using System;using System.NETやASPCollections.NETは「既にあるものを使う」という考えのもと「[[Windows]]の機能」や「[[IIS]]の機能」に依存して、[[C#|C Sharp]]などでの[[ピュア実装]](再実装)を放棄している部分が大多数であった。実際、[[オープンソース]]界隈でもJava愛好者は「[[C言語]]から[[Java]]に移植だ」となるところも、[[C#|C Sharp]]愛好者は「動けばいい」と[[P/Invoke]]するのが定番であった。Generic;using System.Linq;using System.Runtime.InteropServices;
しかし、時は流れ、[[スタンドアローン]]で動く[[アプリ]]が壊滅し、[[スマホ]]の[[ゲーム]]ですら[[サーバー]]必須の時代が到来し、さらに[[クラウド]]業界は[[Linux]]一色になってしまった。.NETも[[Linux]]対応が急務であったが、手抜きP/Invoke実装が足かせとなり[[Mono]]を使ってもボロボロという状況で他のプラットフォームに出遅れる結果となっていた。using Foundation;using AppKit;using CoreGraphics;
そこで「イチから仕切り直しだ」となったようである。namespace OnlineDisplayList{ [Register("AppDelegate")] public class AppDelegate : NSApplicationDelegate { public AppDelegate() { }
従来の [DllImport("/System/Library/Frameworks/CoreGraphics.NET Frameworkは単なる実行環境という雰囲気であったが、.NET Coreでは「dotnetコマンド」ひとつで、いちいちVisual Studioを立ちあげなくてもプロジェクトを作成でき、また地味に面倒な別PCでのビルド環境の復元も一発ででき、さらにビルドそのものも一発ででき、さらにさらに実行までできるようになっている。[[Linux]framework/CoreGraphics")]がメインな人には扱いやすいかもしれない。 static extern int CGGetOnlineDisplayList( int maxDisplays, IntPtr onlineDisplays, out int displayCount);
[DllImport("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics")] static extern CGRect CGDisplayBounds(int displayId);  public override void DidFinishLaunching(NSNotification notification) { // ディスプレイ一覧を取得する // MacBookなどでクラムシェルにしている場合は一覧に含まれない。 int displayMax =16; int displayCount = インストール 0; int memSize =Marshal.SizeOf(typeof(UInt32)) * displayMax; IntPtr memPtr =Marshal.AllocCoTaskMem(memSize);* CGGetOnlineDisplayList(displayMax, memPtr, out displayCount);  int[] displays = new int[displayCount]; Marshal.Copy(memPtr, displays, 0, displayCount);  Marshal.FreeCoTaskMem(memPtr);  // ディスプレイ一覧から個々の位置と解像度を得る foreach (var display in displays) { var rect = CGDisplayBounds(display); Console.NET CoreWriteLine(rect); } } }}</macOSにインストールする]]source>
== 関連項目 ==
; 新* [[.NET Core]]* [[ASPXamarin.NET CoreMac/Retina Displayか判別する]]* [[ASPXamarin.NET Core IdentityMac/ディスプレイの設定変更を検出する]] (microsoft.aspnetcore.identity) ; 旧* [[Xamarin.NET FrameworkMac/NSOpenGLViewをRetina Displayに対応させる]]
== 参考文献 ==
{{stub}}
 
[[category: Xamarin.Mac]]
匿名利用者

案内メニュー