2017-11-27 1 views
0

.NetStandard 2.0 라이브러리에서 런타임시 Android와 Unix를 구별해야합니다. 라이브러리는 .NET 표준을 위해 컴파일해야하므로 #if ANDROID 솔루션이 적합하지 않습니다. Environment.OSVersion이 Android에서 Unix 3.18.14.12365438을 반환합니다.NetStandard 2.0에서 Unix와 Android를 어떻게 구별 할 수 있습니까?

https://www.nuget.org/packages/Xam.Plugin.DeviceInfo/과 같은 다른 솔루션은 Android에서 작동하지 않을 수 있습니다. 런타임시 Mono 프로파일이 누락되어 라이브러리가 여러 대상에 대해 컴파일 된 경우에만 가능합니다.

런타임에이를 감지하는 방법이 있습니까?

답변

1

환경에 뭔가가 필요합니다.

DLLImport externs는 기본 공유 라이브러리 (.so) 및 사용 권한 문제, API 차이 등이 없으면 사용할 수 없습니다.

존재하는 OS 파일은 모래 상자 때문에 번거로울 수 있으므로 File.Exists은 피해야합니다.

하지만 안드로이드는 어떤 사용자 (루트가 아닌 사용자)도 사용할 수있는 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를이, 또는 기타 환경 검사을 속일 반환 값을 스푸핑 할 수 있지만, 당신은 안드로이드 기본에 액세스 할 수없는 한 API를 사용하고 100 % 휴대용 상태를 유지하고자하는 욕구가 있다면 주위에 방법이 보이지 않습니다 ...

관련 문제