差分

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

Xamarin.MacでNLogを使う

589 バイト除去, 2019年5月22日 (水) 05:13
Administrator がページ「Xamarin.Mac/NLogを使う」を「Xamarin.MacでNLogを使う」に移動しました
[[MonoMac]]および[[Xamarin.Mac]]でも[[AppKitNLog]]のNSApplicationのサブクラスを利用したい場面もあることだろう。多くの場合はNSApplicationDelegateで事足りるだろうが、稀にすべてのイベントをトラップしたい場面などではNSApplicationのサブクラスを作る必要がある。を使えると捗る。
==実装1==
===NSApplicationのサブクラスを作る===Register属性で指定した名前は後ほどInfo[[Xamarin.plistで利用される。凄く重要。クラス名と同じにしておくと紛らわしくないと思われる。Mac]]でも[[NLog]]はなんら問題なく使用できる。[[NuGet]]から一発[[インストール]]である。試してはいないが[[MonoMac]]でも同じだと思う。
NSApplicationがデフォルトコンストラクタを持たない関係でサブクラスにもコンストラクタがないとただし[[コンパイルファイル]]が通らないが、に出力する場合に注意が必要で、[[デバッガMac OS X]]で追ってみた限りでは呼ばれている気配はない。そのためAwakeFromNibメソッドをオーバーライドして初期化している。これでいいのかは知らん。<source lang="csharp"> using System;ではあらゆる[[ファイル]]は[[アプリ]]の外部に保存する必要があるため、NLog.configファイルの設定例でよく見かける「basedir変数」以下に書き込む設定は使えない。
using Foundation;===ファイルに出力するNLog.configの設定例=== using AppKit;そこで以下の例では[[Mac OS X]]では定番の「~/Library/Logs/」以下に出力してみた。
[Register(<source lang="Appxml")]> public class App <?xml version="1.0" encoding="utf-8" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http: NSApplication//www.nlog-project.org/schemas/NLog.xsd NLog.xsd" { autoReload="true" public App(IntPtr handle) throwExceptions="false" internalLogLevel="Off" internalLogFile="c: base(handle) {}\temp\nlog-internal.log" >
public App(NSCoder coder) : base(coder) {} <variable name="appname" value="monobook"/>
/// <summarytargets> /// 初期化はAwakeFromNibのタイミングでいいのか? <target xsi:type="File" name="logfile" fileName="${specialfolder:folder=MyDocuments}/Library/Logs/ 調査中 /// <${appname}/summary> public override void AwakeFromNib() ${ baseshortdate}.AwakeFromNib();log" this.Delegate layout= new AppDelegate(); "${longdate} ${uppercase:${level}} ${message}" />
/// <summary> /// こいつをオーバーライドすればほぼ全てのイベントが取れる /// </summary> /// <param target xsi:type="Console" name="theEventconsole">The event.</param> public override void SendEvent(NSEvent theEvent) { base.SendEvent(theEvent); } }</source===Info.plistに「Principal class」を設定する===Info.plistを開き、Xamarin Studio下部の「ソース」タブを選択する。Info.plistがない場合はファイルを追加する(新規追加ダイアログでは「Application Manifest」という名称になっているはず)。 プロパティの一覧が列挙されるので、プロパティ「Principal class」に「String」型で前述のRegister属性で付けた名前を入力する(この例であれば「App」)。プロパティ「Principal class」がない場合はリスト下部の「Add new entry」を選べば新しい行が追加される。
===エントリポイントを書き換える===Xamarin Studioで「空のプロジェクト」を作ると初期値でこんな感じになっている。 <source lang="csharp"/targets> static class MainClass { static void Main(string[] args) { NSApplication.Init();
var application <rules> <logger name= NSApplication.SharedApplication;"*" minlevel="Trace" writeTo="logfile" /> application.Delegate <logger name= new AppDelegate(); application.Run();"*" minlevel="Info" writeTo="console" /> } </rules> }</nlog>
</source>
NLogに設定するパスは[[絶対パス]]なので、ホームディレクトリのパスの取得は「[[MonoMac/特殊ディレクトリのパスを取得する]]」を用いてMyDocumentsを指定することで取得した。
また、NLog.config中でアプリ名を動的に取得する方法がわからなかったので、この例では自前でappname変数を用意している。
これを以下のように書き換える。なお「空のプロジェクト」ではなく「Cocoa」を選ぶと最初からこうなっている。<source lang="csharp"> using System;==備考=== using AppKit;NLog.configは初期状態でビルド時にコピーされない設定になっていると思うので修正するのを忘れないこと。NLog.configファイルのプロパティの「出力ディレクトリにコピー」の値を「新しい場合のみコピー」または「常にコピー」に設定する。
static class MainClass===不具合=== {これは2015年8月3日の情報です。 static void Main(string[[Xamarin.Mac]] args) { NSApplicationにおいて「Debugビルド」を行うとアプリ内(***.Init(); NSApplicationapp内)のMonoBundleディレクトリにNLog.Main(args); } }</source>configファイルが生成(コピー)されるが、「Releaseビルド」では生成されないようだ。たぶん[[不具合]]だと思う。
==関連項目==
*[[MonoMac/特殊ディレクトリのパスを取得する]]
==参考文献==
{{stub}}
[[category:XamainXamarin.Mac]]
[[category:MonoMac]]
匿名利用者

案内メニュー