csdd123562 2025-11-28 15:05 采纳率: 0%
浏览 5

AvaloniaUI 使用CefNet浏览器 发布到Mac下运行错误

错误提示 objc[3153]: Class ExtensionDropdownHandler is implemented in both
libAvaloniaNative.dylib (0x10ac85fb8) and Chromium Embedded Framework.framework/Chromium Embedded Framework (0x1b14f2dd0). One of the two will be used. Which one is undefined
[0813/085920.102646:ERROR:icu_util.cc(175)] icudtl.dat not found in bundle
[0813/085920.102954:ERROR:icu_util.cc(225)] Invalid file descriptor to ICU data received.

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-11-28 15:06
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的错误信息表明在使用 AvaloniaUI + CefNet 时,Objective-C 类 ExtensionDropdownHandler 被重复加载,并且 ICU 数据文件未正确加载。这通常发生在 macOS 上运行 Avalonia + CefNet 项目时,因为 CefNet 依赖于 Chromium Embedded Framework (CEF),而 CEF 在 macOS 上的动态库(.dylib)与 Avalonia 的原生库存在冲突。


    ✅ 问题分析

    1. 重复类加载问题

      • 错误提示:Class ExtensionDropdownHandler is implemented in both libAvaloniaNative.dylib and Chromium Embedded Framework.framework/Chromium Embedded Framework
      • 原因:Avalonia 和 CEF 都包含了对同一个 Objective-C 类的实现,导致链接器无法确定使用哪一个。
    2. ICU 数据文件缺失

      • 错误提示:icudtl.dat not found in bundleInvalid file descriptor to ICU data received
      • 原因:CEF 无法找到 ICU 数据文件,这通常是因为构建时没有将这些资源正确打包到 .app 包中。

    🔧 解决方案

    1. 确保 CEF 资源正确打包到 .app 文件中

    CefNet 在 macOS 上需要将一些资源文件(如 icudtl.dat)打包进 .app,否则会报错。

    ✅ 修改步骤:

    • 手动复制资源文件: 在你的项目中,确保以下文件被正确复制到 .app 中:

      /Resources/cef/Release/icudtl.dat
      /Resources/cef/Release/libcef.dylib
      /Resources/cef/Release/chrome_elf
      /Resources/cef/Release/chrome.pak
      

      如果你是通过 dotnet publish 发布应用,可以添加自定义的 MSBuild 任务来复制这些文件。

    ✅ 示例代码(MSBuild 自定义任务):

    <Target Name="CopyCefResources" AfterTargets="Publish">
      <ItemGroup>
        <CefFiles Include="$(ProjectDir)bin\$(Configuration)\osx-x64\*.*" />
      </ItemGroup>
      <Copy SourceFiles="@(CefFiles)" DestinationFolder="$(OutputPath)" />
    </Target>
    

    注意:请根据你的实际路径进行调整。


    2. 避免重复加载 Objective-C 类

    这个错误是由于 Avalonia 和 CEF 同时包含相同的 Objective-C 类导致的。虽然这个问题在 CefNet 中可能难以完全避免,但可以通过以下方式缓解:

    ✅ 方法一:禁用 Avalonia 的原生功能(如果不需要)

    如果你不需要 Avalonia 的原生 UI 功能,可以尝试使用纯 C# UI 框架,例如:

    • 使用 Avalonia.Controls 作为 UI 层
    • 不使用 Avalonia.NativeAvalonia.Skia 等原生模块

    ✅ 方法二:修改 CefNet 的启动参数

    在 CefNet 初始化时,尝试禁用某些可能导致冲突的功能:

    var settings = new CefSettings();
    settings.CefCommandLineArgs.Add("disable-gpu", "1");
    settings.CefCommandLineArgs.Add("no-sandbox", "1");
    
    Cef.Initialize(settings);
    

    3. 使用正确的 CefNet 版本

    确保你使用的 CefNet 版本兼容当前的 Avalonia 和 macOS 版本。建议使用:

    • Avalonia 0.10.x 或更高版本
    • CefNet 85.x 或 87.x

    你可以从 NuGet 安装最新稳定版。


    4. 打包成 .app 并验证资源

    使用 dotnet publish 打包后,检查生成的 .app 包中的内容是否包含所有必要的 CEF 资源。

    ✅ 示例命令:

    dotnet publish -r osx-x64 -c Release --self-contained true
    

    然后打开生成的 .app 文件夹,查看 /Contents/Resources/cef/ 下是否有如下文件:

    • icudtl.dat
    • libcef.dylib
    • chrome_elf
    • chrome.pak

    如果没有,请检查你的构建配置或手动复制。


    🧪 测试和验证

    1. 运行你的应用,观察控制台输出。
    2. 查看是否还有 objc[3153]icudtl.dat not found 错误。
    3. 如果仍然有问题,尝试使用 stracedtruss 跟踪加载的动态库。

    📦 总结

    | 问题 | 解决方案 | |------|----------| | ExtensionDropdownHandler 重复加载 | 确保 CEF 和 Avalonia 不共用相同类,或禁用部分原生功能 | | icudtl.dat not found | 正确打包 CEF 资源到 .app 中 | | CefNet 兼容性 | 使用兼容的 CefNet 和 Avalonia 版本 | | 构建流程 | 使用 dotnet publish 并验证资源是否完整 |


    如有需要,我可以提供一个完整的 csproj 文件示例,帮助你正确集成 CefNet 和 Avalonia。是否需要?

    评论

报告相同问题?

问题事件

  • 创建了问题 11月28日