Xamarin Forms添加HybridWebViewRenderer触发CultureInfoException求助
问题与解决方案
问题描述
Xamarin Forms项目原本运行正常,添加HybridWebViewRenderer后出现CultureInfoException,错误提示「Public Token name cannot be null」。注释掉[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]代码行后,错误消失。
报错信息:
[monodroid-assembly] open_from_bundles: failed to load assembly potthål, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.dll
System.Globalization.CultureNotFoundException: 'Culture name neutral, PublicKeyToken=null is not supported.
Parameter name: name'
按Microsoft Learn示例操作,示例项目可正常运行,但将渲染器及相关类移入自己项目后触发错误。相关代码如下:
const string JavascriptFunction = @" function invokeCSharpAction(data) { jsBridge.invokeAction(data); } function testFunction(data) { console.log('funkar hit'); jsBridge.invokeTest(data); }"; Context _context; public HybridWebViewRenderer(Context context) : base(context) { _context = context; } protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) { base.OnElementChanged(e); if (e.OldElement != null) { Control.RemoveJavascriptInterface("jsBridge"); ((HybridWebView)Element).Cleanup(); } if (e.NewElement != null) { Control.SetWebViewClient(new JavascriptWebViewClient(this, $"javascript: {JavascriptFunction}")); Control.AddJavascriptInterface(new JSBridge(this), "jsBridge"); string a = ((HybridWebView)Element).Uri; Control.LoadUrl($"file:///android_asset/Content/{((HybridWebView)Element).Uri}"); } } protected override void Dispose(bool disposing) { if (disposing) { ((HybridWebView)Element).Cleanup(); } base.Dispose(disposing); }
解决方案
- 修改程序集/项目名称:报错中提到的
potthål包含特殊字符(å),MonoDroid加载程序集时会因特殊字符解析Culture信息失败。将项目或程序集名称改为不含特殊字符的格式(如Potthal),重新生成项目。 - 校验ExportRenderer特性:确保
HybridWebView与HybridWebViewRenderer的命名空间完全正确,ExportRenderer特性中的类型与项目中自定义WebView类型完全匹配,无拼写错误。 - 清理重建项目:删除项目的bin、obj目录,清理NuGet缓存后重新编译整个解决方案,避免旧编译残留引发异常。
- 检查JSBridge类:确认
JSBridge类为public访问级别,且供JS调用的方法标记了[JavascriptInterface]特性,权限或特性缺失可能间接导致程序集加载异常。
内容的提问来源于stack exchange,提问作者infereno
相关产品推荐
相关产品推荐

