2017-11-27 20 views
0

実行時に.Net Standard 2.0ライブラリでAndroidとUnixを区別する必要があります。ライブラリは.Net標準のためにコンパイルする必要がありますので、#if ANDROIDソリューションは適切ではありません。 Environment.OSVersionは、Unix 3.18.14.12365438をAndroidで返します。NetStandard 2.0でUnixとAndroidを区別するにはどうすればよいですか?

https://www.nuget.org/packages/Xam.Plugin.DeviceInfo/のような他のソリューションは、Androidで動作しません。なぜなら、Monoプロファイルは実行時に欠落し、ライブラリが複数のターゲット用にコンパイルされている場合のみ可能です。

実行時にこれを検出する方法はありますか?

答えて

1

あなたは何か環境が必要です。

ネイティブ共有ライブラリ(.so)にアクセスせずに、アクセス許可の問題、APIの違いなど。DLLImport externsは最適なオプションではありません。

OSファイルが存在すると、サンドボックス化のために厄介なことがありますので、File.Existsは避けてください。

しかし、Androidには、すべてのユーザー(ルート以外のユーザー)が使用できるcmdのgetpropがあります。常にシェルのパスにあり、実行してAndroid上の値を返します。安いが、それは動作します...

public static class AndroidTest 
{ 
    static bool? isAndroid; 
    public static bool Check() 
    { 
     if (isAndroid != null) return (bool)isAndroid; 
     using (var process = new System.Diagnostics.Process()) 
     { 
      process.StartInfo.FileName = "getprop"; 
      process.StartInfo.Arguments = "ro.build.user"; 
      process.StartInfo.RedirectStandardOutput = true; 
      process.StartInfo.UseShellExecute = false; 
      process.StartInfo.CreateNoWindow = true; 
      try 
      { 
       process.Start(); 
       var output = process.StandardOutput.ReadToEnd(); 
       isAndroid = string.IsNullOrEmpty(output) ? (bool?)false : (bool?)true; 
      } 
      catch 
      { 
       isAndroid = false; 
      } 
      return (bool)isAndroid; 
     } 
    } 
} 

注:もちろん誰かがgetprop CMDおよびその戻り値これをだますために、またはその他の環境のチェックをだますことができますが、あなたは、Androidのネイティブへのアクセス権を持っていない限り、 APIを使用して100%可搬性を維持したいという欲求がある場合、私はそれを回避する方法は見当たりません。

関連する問題