如何在NetStandard 2.0上区分Unix和Android?

时间:2017-11-27 22:36:45

标签: c# mono runtime .net-standard

我需要在运行时在.NetStandard 2.0库中区分Android和Unix。库必须为.Net Standard编译,因此#if ANDROID解决方案不适合。 Environment.OSVersion在Android上返回Unix 3.18.14.12365438

其他解决方案(如https://www.nuget.org/packages/Xam.Plugin.DeviceInfo/)无法在Android上运行,因为Mono Profile在运行时缺失,只有在为多个目标编译库时才有可能。

有没有办法在运行时检测到这个?

1 个答案:

答案 0 :(得分:1)

你需要环保的东西。

没有进入本机共享库(.so)和权限问题,API差异等等。DLLImport externs不是一个很好的选择。

由于沙盒的存在,操作系统文件很麻烦,因此应避免使用File.Exists

但Android确实有一个可供任何用户(即非root用户)使用的cmd getprop,它始终位于shell路径中,因此如果它执行并返回您在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%便携,我没有看到它的方法...