加载ZXing.Net.Mobile.Forms时遭遇NullReferenceException求助
解决Xamarin中ZXing.Net.Mobile.Forms未初始化导致的NullReferenceException
嘿,这个问题我太熟悉了——ZXing.Net.Mobile.Forms虽然是Xamarin开发二维码扫描的首选工具,但它必须完成平台初始化才能正常工作,哪怕你还没写任何扫描相关的业务代码,否则启动时就会触发NullReferenceException。下面是一步步的解决方案:
1. 共享项目(或.NET Standard项目)的全局初始化
在你的App.xaml.cs的OnStart(或者OnLaunching,取决于项目模板)方法中添加初始化代码:
protected override void OnStart() { // 初始化ZXing扫描组件 ZXing.Net.Mobile.Forms.ZXingScannerView.Initialize(); // 也可以传入配置选项,比如默认的扫描设置 // var scannerOptions = new ZXing.Mobile.MobileBarcodeScannerOptions(); // ZXing.Net.Mobile.Forms.ZXingScannerView.Initialize(scannerOptions); }
2. Android平台的特定初始化
打开Android项目的MainActivity.cs:
- 在
OnCreate方法中,LoadApplication(new App())之前添加平台初始化代码:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 初始化ZXing Android平台 ZXing.Net.Mobile.Forms.Android.Platform.Init(); Xamarin.Essentials.Platform.Init(this, savedInstanceState); LoadApplication(new App()); }
- 重写权限请求回调方法(相机权限是扫描必需的):
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { ZXing.Net.Mobile.Forms.Android.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
3. iOS平台的特定初始化
打开iOS项目的AppDelegate.cs:
- 在
FinishedLaunching方法中,LoadApplication(new App())之前添加平台初始化代码:
public override bool FinishedLaunching(UIApplication app, NSDictionary options) { // 初始化ZXing iOS平台 ZXing.Net.Mobile.Forms.iOS.Platform.Init(); global::Xamarin.Forms.Forms.Init(); LoadApplication(new App()); return base.FinishedLaunching(app, options); }
- 别忘了在
Info.plist中添加相机权限描述(iOS强制要求),否则会因权限不足崩溃:
<key>NSCameraUsageDescription</key> <string>需要访问相机来扫描二维码</string>
为什么会出现这个问题?
ZXing.Net.Mobile.Forms的底层组件依赖于平台特定的原生库和权限配置,即使你还没在界面上添加ZXingScannerView,包内部的一些初始化逻辑也会在应用启动时触发,如果缺少平台初始化步骤,就会导致内部引用为空,从而抛出NullReferenceException。
按照上面的步骤完成初始化后,再运行应用应该就能正常启动了。
内容的提问来源于stack exchange,提问作者That Snowing Summer
相关产品推荐
相关产品推荐

