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

.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组件,需确保以下包版本完全一致:

  • SkiaSharp
  • SkiaSharp.Views.Maui
  • SkiaSharp.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:12:41