我有一个迁移Xamarin.Forms解决方案,并使用VS 2022。
该解决方案保持了原始结构:Android和iOS项目。
在Android项目中,我有以下代码:
class DeviceInfoProvider: IDeviceInfoProvider
{
public string GetAppVarsion()
{
#if ANDROID33_0_OR_GREATER
var packageManager = Platform.AppContext.PackageManager;
var packageName = Platform.AppContext.PackageName;
var flags = PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData);
var appVer = packageManager.GetPackageInfo(packageName, flags).VersionName;
return appVer;
#else
var appVer = Platform.AppContext.PackageManager.GetPackageInfo(Platform.AppContext.PackageName, 0).VersionName;
return appVer;
#endif
}
}
由于某种原因,VS 2022不尊重预处理器,我看到使用了#if ANDROID33_0_OR_GREATER
,即使我连接的移动终端是API 31. 0。
这是一个VS问题,还是我需要在项目中配置一些东西来允许它工作?
1条答案
按热度按时间jgzswidk1#
预处理器指令是编译时特性,而不是运行时特性。
在
ANDROID33_0_OR_GREATER
中使用预处理器意味着目标API是Android API 33.0或更高版本,因此如果您将目标API设置为33.0,则if子句中的代码将包含在编译的IL代码中,否则不会包含。但是,即使在Android API 31.0上运行的设备仍然可以 (尝试) 执行代码,它可能会引发运行时异常,因为某些API可能在该特定操作系统版本上不可用。
您不应使用预处理器指令,而应使用运行时检查您运行应用的操作系统的API版本,例如:
由于您似乎正在检查应用程序版本,您可能还想给予App information一次尝试,MAUI已经为此公开了属性: