.NET MAUI(Mac平台)LiveCharts与SkiaSharp触发类型初始化异常
.NET MAUI集成LiveCharts时SkiaSharp DllNotFound异常排查与解决
问题概述
在.NET MAUI项目中集成LiveCharts 2.0.0-beta.330,已遵循官网安装步骤,但运行时触发System.TypeInitialisationException,内部异常为System.DllNotFoundException(关联SkiaSharp.SKObject类型)。
相关代码片段
ViewModel代码
using System; using LiveChartsCore; using LiveChartsCore.SkiaSharpView; using System.Collections.ObjectModel; using LiveChartsCore.Defaults; using LiveChartsCore.SkiaSharpView.Drawing.Geometries; using CommunityToolkit.Mvvm.ComponentModel; namespace TheCuriousCreative2.ViewModels { public class ViewModel { public ISeries[] Series { get; set; } = new ISeries[] { new LineSeries<double> { Values = new double[] { 2, 1, 3, 5, 3, 4, 6 }, Fill = null } }; } }
XAML前端代码
<ContentPage Shell.NavBarIsVisible="False" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:TheCuriousCreative2.ViewModels;assembly=TheCuriousCreative2" xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.Maui;assembly=LiveChartsCore.SkiaSharpView.Maui" xmlns:lvcore="clr-namespace:LiveChartsCore;assembly=LiveChartsCore" x:Class="TheCuriousCreative2.Dashboard" > <ContentPage.BindingContext> <local:ViewModel/> </ContentPage.BindingContext> <ContentPage.Content> <HorizontalStackLayout> <lvc:CartesianChart Series="{Binding Series}"> </lvc:CartesianChart> </HorizontalStackLayout> </ContentPage.Content> </ContentPage>
Program.cs配置
using SkiaSharp.Views.Maui.Controls.Hosting; // ... var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .UseSkiaSharp(true) // 其他配置...
排查与解决方法
1. 验证SkiaSharp包版本兼容性
LiveCharts 2.0.0-beta.330依赖特定版本的SkiaSharp组件,需确保以下包版本完全一致:
SkiaSharpSkiaSharp.Views.MauiSkiaSharp.NativeAssets.Android(Android平台)SkiaSharp.NativeAssets.iOS(iOS平台)SkiaSharp.NativeAssets.Win32(Windows平台)
可通过NuGet包管理器查看LiveCharts的依赖版本,安装对应匹配的SkiaSharp包,避免版本不匹配导致原生库加载失败。
2. 确保全平台NativeAssets包安装完整
部分平台的原生SkiaSharp库需要单独安装NuGet包,若仅安装基础包会导致对应平台缺失原生DLL。检查项目是否为目标平台安装了对应的NativeAssets包:
- Android:安装
SkiaSharp.NativeAssets.Android - iOS:安装
SkiaSharp.NativeAssets.iOS - Windows:安装
SkiaSharp.NativeAssets.Win32
3. 清理项目缓存并重建
缓存的旧库或编译产物可能引发冲突,执行以下步骤:
- 删除项目根目录下的
bin和obj文件夹 - 清理NuGet缓存:执行命令
dotnet nuget locals all --clear - 重新还原依赖:执行命令
dotnet restore - 重新构建项目
4. 检查Program.cs配置顺序
确保.UseSkiaSharp(true)配置在正确位置,需放在.UseMauiApp<App>()之后、.Build()之前,示例:
var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .UseSkiaSharp(true) .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); }); return builder.Build();
5. 处理平台特定链接器/裁剪问题
若项目启用了AOT编译或链接器优化,可能导致SkiaSharp的原生库被意外裁剪:
- Android/iOS:在项目的
linker.xml文件中添加以下配置,确保SkiaSharp相关类型不被裁剪:<assembly fullname="SkiaSharp"> <type fullname="SkiaSharp.*" preserve="all" /> </assembly> <assembly fullname="SkiaSharp.Views.Maui"> <type fullname="SkiaSharp.Views.Maui.*" preserve="all" /> </assembly> - Windows:检查是否启用了"裁剪未使用的代码",若启用需确保SkiaSharp的原生库被包含在输出目录中。
内容的提问来源于stack exchange,提问作者isla_just
相关产品推荐
相关产品推荐

