我如何区分 Unix 和 NetStandard 2.0 上的 Android?
How can I distinguish between Unix and Android on NetStandard 2.0?
我需要在 .NetStandard 2.0 库中在运行时区分 Android 和 Unix。该库必须针对 .Net Standard 进行编译,因此 #if ANDROID
解决方案不合适。
Environment.OSVersion returns Unix 3.18.14.12365438
Android。
https://www.nuget.org/packages/Xam.Plugin.DeviceInfo/ 等其他解决方案无法在 Android 上运行,因为 Mono 配置文件在运行时丢失,并且只有在为多个目标编译库时才有可能。
有没有办法在运行时检测到这个?
你需要一些环保的东西。
无需进入本机共享库 (.so
) 和权限问题,API 差异等。DLLImport
externs 不是一个很好的选择。
存在的 OS 文件可能由于沙盒而变得麻烦,因此应避免 File.Exists
。
但是 Android 确实有一个 cmd getprop
对任何用户(即非 root)可用,它总是在 shell 路径中,因此如果它执行并且 return 是您在 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 及其 return 值来欺骗这个, 或任何其他环境检查,但除非您可以访问 Android 本机 APIs 并且希望保持 100% 的可移植性,否则我看不到解决它的方法...
我需要在 .NetStandard 2.0 库中在运行时区分 Android 和 Unix。该库必须针对 .Net Standard 进行编译,因此 #if ANDROID
解决方案不合适。
Environment.OSVersion returns Unix 3.18.14.12365438
Android。
https://www.nuget.org/packages/Xam.Plugin.DeviceInfo/ 等其他解决方案无法在 Android 上运行,因为 Mono 配置文件在运行时丢失,并且只有在为多个目标编译库时才有可能。
有没有办法在运行时检测到这个?
你需要一些环保的东西。
无需进入本机共享库 (.so
) 和权限问题,API 差异等。DLLImport
externs 不是一个很好的选择。
存在的 OS 文件可能由于沙盒而变得麻烦,因此应避免 File.Exists
。
但是 Android 确实有一个 cmd getprop
对任何用户(即非 root)可用,它总是在 shell 路径中,因此如果它执行并且 return 是您在 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 及其 return 值来欺骗这个, 或任何其他环境检查,但除非您可以访问 Android 本机 APIs 并且希望保持 100% 的可移植性,否则我看不到解决它的方法...