Visual Studio Maui Android版预处理器

qzlgjiam  于 2023-10-23  发布在  Android
关注(0)|答案(1)|浏览(161)

我有一个迁移Xamarin.Forms解决方案,并使用VS 2022。
该解决方案保持了原始结构:Android和iOS项目。
在Android项目中,我有以下代码:

  1. class DeviceInfoProvider: IDeviceInfoProvider
  2. {
  3. public string GetAppVarsion()
  4. {
  5. #if ANDROID33_0_OR_GREATER
  6. var packageManager = Platform.AppContext.PackageManager;
  7. var packageName = Platform.AppContext.PackageName;
  8. var flags = PackageManager.PackageInfoFlags.Of((int)PackageInfoFlags.MetaData);
  9. var appVer = packageManager.GetPackageInfo(packageName, flags).VersionName;
  10. return appVer;
  11. #else
  12. var appVer = Platform.AppContext.PackageManager.GetPackageInfo(Platform.AppContext.PackageName, 0).VersionName;
  13. return appVer;
  14. #endif
  15. }
  16. }

由于某种原因,VS 2022不尊重预处理器,我看到使用了#if ANDROID33_0_OR_GREATER,即使我连接的移动终端是API 31. 0。
这是一个VS问题,还是我需要在项目中配置一些东西来允许它工作?

jgzswidk

jgzswidk1#

预处理器指令是编译时特性,而不是运行时特性。
ANDROID33_0_OR_GREATER中使用预处理器意味着目标API是Android API 33.0或更高版本,因此如果您将目标API设置为33.0,则if子句中的代码将包含在编译的IL代码中,否则不会包含。
但是,即使在Android API 31.0上运行的设备仍然可以 (尝试) 执行代码,它可能会引发运行时异常,因为某些API可能在该特定操作系统版本上不可用。
您不应使用预处理器指令,而应使用运行时检查您运行应用的操作系统的API版本,例如:

  1. if (OperatingSystem.IsAndroidVersionAtLeast(33))
  2. {
  3. // do stuff that is only supported on API 33 or higher here
  4. }

由于您似乎正在检查应用程序版本,您可能还想给予App information一次尝试,MAUI已经为此公开了属性:

  1. string version = AppInfo.Current.VersionString;

相关问题