You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:10:25