我需要在运行时在.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在运行时缺失,只有在为多个目标编译库时才有可能。
有没有办法在运行时检测到这个?
答案 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%便携,我没有看到它的方法...