当我在标准 wpf mvvm C# 项目中使用 mapsui 时,一切正常,但是当我尝试在 Revit 插件中使用 Mapsui 地图时,出现以下错误:
Method not found: "SkiaSharp.SKPicture SkiaSharp.SKPicture.Deserialize(System.ReadOnlySpan`1<Byte>)".
Exception: System.MissingMethodException: Method not found: "SkiaSharp.SKPicture SkiaSharp.SKPicture.Deserialize(System.ReadOnlySpan`1<Byte>)".
at Mapsui.Rendering.Skia.BitmapHelper.LoadBitmap(Object bitmapStream)
at Mapsui.Rendering.Skia.RasterStyleRenderer.Draw(SKCanvas canvas, Viewport viewport, ILayer layer, IFeature feature, IStyle style, IRenderCache renderCache, Int64 currentIteration)
我在 Revit 插件中使用与标准 wpf 项目完全相同的 mapusi 版本及其依赖项。
所有其他对象(例如来自 geojson 或其他的几何图形)均正确显示,只有 WMS 服务(图像)会导致此错误。
此错误的原因可能是什么?
最可能的原因是 .dll 冲突。基本上,其他某个插件或 Revit 本身正在加载该程序集引用的某个不同版本,并且该版本没有您正在引用的方法。
在代码中,您可以通过执行以下操作来检查程序集版本和位置:
var version = typeof(SkiaSharp.SKPicture).Assembly.ImageRuntimeVersion;
var loadedDllPath = typeof(SkiaSharp.SKPicture).Assembly.Location;
更关键的是,如果确实存在冲突,您无法真正更改或控制首先加载哪个程序集,即使您这样做,也可能会破坏其他内容。对于任何应用程序中的插件来说,这始终是一个问题,因为您只能将单个程序集加载到正在执行的应用程序的全局程序集缓存中。 Revit 的 API 有额外的处理来确保这种情况,并且它优先对待需要加载的 .dll。这可确保主应用程序始终加载不会给 Revit 本身带来问题的 .dll。
由于 SkiaSharp 是一个 开源项目 ,处理此问题的最简单方法可能是创建该存储库的分支,然后使用新名称创建构建。还有其他选择,但它们至少都更复杂一点。