错误提示 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.
AvaloniaUI 使用CefNet浏览器 发布到Mac下运行错误
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
檀越@新空间 2025-11-28 15:06关注下午好🌅🌅🌅
本答案参考通义千问你遇到的错误信息表明在使用 AvaloniaUI + CefNet 时,Objective-C 类
ExtensionDropdownHandler被重复加载,并且 ICU 数据文件未正确加载。这通常发生在 macOS 上运行 Avalonia + CefNet 项目时,因为 CefNet 依赖于 Chromium Embedded Framework (CEF),而 CEF 在 macOS 上的动态库(.dylib)与 Avalonia 的原生库存在冲突。
✅ 问题分析
-
重复类加载问题
- 错误提示:
Class ExtensionDropdownHandler is implemented in both libAvaloniaNative.dylib and Chromium Embedded Framework.framework/Chromium Embedded Framework - 原因:Avalonia 和 CEF 都包含了对同一个 Objective-C 类的实现,导致链接器无法确定使用哪一个。
- 错误提示:
-
ICU 数据文件缺失
- 错误提示:
icudtl.dat not found in bundle、Invalid 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.Native或Avalonia.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.datlibcef.dylibchrome_elfchrome.pak
如果没有,请检查你的构建配置或手动复制。
🧪 测试和验证
- 运行你的应用,观察控制台输出。
- 查看是否还有
objc[3153]或icudtl.dat not found错误。 - 如果仍然有问题,尝试使用
strace或dtruss跟踪加载的动态库。
📦 总结
| 问题 | 解决方案 | |------|----------| |
ExtensionDropdownHandler重复加载 | 确保 CEF 和 Avalonia 不共用相同类,或禁用部分原生功能 | |icudtl.dat not found| 正确打包 CEF 资源到.app中 | | CefNet 兼容性 | 使用兼容的 CefNet 和 Avalonia 版本 | | 构建流程 | 使用dotnet publish并验证资源是否完整 |
如有需要,我可以提供一个完整的
csproj文件示例,帮助你正确集成 CefNet 和 Avalonia。是否需要?解决 无用评论 打赏 举报-