C# SkiaSharp外部组件异常如何解决?

问题描述

这是一个绘图模块开发,我使用了SkiaSharp绘图库代替GDI+。
具体的场景是加载文件,解析出点线弧圆的数据,然后绘制出来,并且之后这图片存在一些交互操作,例如拖拽移动,鼠标滚轮放大缩小等。
在绘图处理中,为了大文件(数据量较大)加载后绘图的交互效率,做了一些优化措施,其中有这么一项优化处理,在进行鼠标拖拽移动时,将数据绘制的内容临时缓存起来(Bitmap),在拖拽期间,只要将临时缓存的位图结合鼠标移动距离画在画布上即可,无需每次重绘都要遍历数据绘制图像,可以节省重绘时间,使得交互更加丝滑。
用伪代码表示如下:

//绘图方法, 在每次重绘事件中调用
private void Drawing(SKCanvas canvas)
{
    if (IsNeedRedraw && IsMouseDrag)
    {
        using var tempCanvas = new SKCanvas(cacheBitmap);

        //tempCanvas进行系列绘制处理...

        //绘制缓存位图
        var offset = new SKPoint(mouseOffset.X, mouseOffset.Y);
        canvas.DrawBitmap(cacheBitmap, offset); // 此处会出现异常!
    }

    //canvas进行系列绘制处理...
}

在上述代码中,调用SKCanvas.DrawBitmap偶尔会出现异常:

img

异常定位信息:

img

VS2022查看反编译代码,定位到如下位置:

img

比较让人奇怪的是,这个异常不是一直出现的,我尝试用try catch语句将异常部分包裹, 只是偶尔出现,可以看到底层API传入的是位图的句柄,我也查了传入的句柄,正常和不正常时的句柄都是不变的。

现在测试下来的情况表现如下:

  1. 加载小文件绘图不会报异常,大文件绘图偶尔会报"外部组件发生异常"
  2. 32位程序才会存在异常问题,换64位程序不会出现该问题

想请教一下,关于"外部组件发生异常"的异常该如何排查和解决?
有什么经验和思路可以提供下?


经过排查,是依赖项中引用了别的包影响的,移除掉就不会再报这个异常了。