プログラムの実行中に、MonoランタイムとMicrosoftランタイムのどちらを使用して実行されているのか知りたいのですが。
現在、次のコードを使用して、MSCLRを使用しているかどうかを確認しています。
static bool IsMicrosoftCLR()
{
return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft");
}
ただし、これはランタイムのインストールフォルダーにいくらか依存しており、これがすべてのインストールで機能するかどうかはわかりません。
現在のランタイムを確認するためのより良い方法はありますか?
Monoプロジェクトの Winformsアプリケーションの移植ガイド :
public static bool IsRunningOnMono ()
{
return Type.GetType ("Mono.Runtime") != null;
}
もっとたくさんの質問があると思いますので、このガイドと mono-forums をチェックする価値があります
このようにMonoランタイムをチェックできます
bool IsRunningOnMono = (Type.GetType ("Mono.Runtime") != null);
C#6の登場により、これをget-onlyプロパティに変換できるようになったため、実際のチェックは1回だけ実行されます。
internal static bool HasMono { get; } = Type.GetType("Mono.Runtime") != null;
以下のコードを実行するだけです。
static bool IsMicrosoftCLR()
{
return (Type.GetType ("Mono.Runtime") == null)
}
これが私のプロジェクトで使用しているキャッシュ付きのバージョンです:
public static class PlatformHelper
{
private static readonly Lazy<bool> IsRunningOnMonoValue = new Lazy<bool>(() =>
{
return Type.GetType("Mono.Runtime") != null;
});
public static bool IsRunningOnMono()
{
return IsRunningOnMonoValue.Value;
}
}
@ahmet alp balkanが述べたように、これを頻繁に呼び出す場合は、ここでキャッシュが役立ちます。 Lazy<bool>
でラップすることにより、リフレクション呼び出しは1回だけ発生します。