Fody Costura无法嵌入SkiaSharp DLL。

4
我创建了一个解决方案,使用Costura.Fody nuget包将引用的程序集合并为嵌入资源。 我希望这样可以为我的应用程序创建单个exe文件。 这在添加对SkiaSharp的引用(具体地说是nuget包SkiaSharp和SkiaSharp.Svg)之前一直运作良好。 然而,libSkiaSharp.dll没有被嵌入,而是内置于启动项目文件夹中,并且我无法独立运行程序exe,除非我将dll保留在同一文件夹中。 有没有办法解决这个问题呢?
以下是重现此问题的步骤: 1. 创建新的WPF项目 2. 添加Costura.Fody和Fody nuget包。 3. 添加名为FodyWeavers.xml的文件,并将其内容设置为:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <Costura/>
</Weavers> 
  1. 在bin/Debug文件夹中构建并运行exe文件。请注意,即使移动exe到新位置,程序也会启动。
  2. 添加SkiaSharp和SkiaSharp.Svg nuget包。
  3. 获取一个svg文件并将其添加到项目目录中
  4. 将以下代码添加到MainWindow构造函数中:

    var svg = new SKSvg(); svg.Load("image.svg"); SKCanvas canvas = new SKCanvas(new SKBitmap()); canvas.DrawPicture(svg.Picture);

  5. 请注意,如果复制图像文件和exe并放置在另一个目录中,则exe将无法启动。这是因为找不到libSkiaSharp.dll。


顺便说一下,我认为这个问题的原因与libSkiaSharp.dll是一个本地库有关。然而,我已经尝试在FodyWeavers.xml文件中添加对该库的引用,使用IncludeAssemblies标签。但到目前为止,我还没有弄清楚如何嵌入所有dlls。 - user2481095
2个回答

3

在你的项目中创建一个Costura32和/或Costura64文件夹。根据它的位数,将libSkiaSharp.dll复制到相应的目录中。Costura会自动从这些目录解压和加载本地二进制文件。


1
这很有帮助,因为它确实可以工作。但是,如果我更新SkiaSharp nuget包,那么这些文件可能会过时而没有人知道。将后期构建事件添加到从调试文件夹复制libSkiaSharp文件到Costura文件夹中是行不通的,因为需要将文件作为嵌入式资源引用。成功的构建取决于这些文件是否存在,因此它们不能在构建后被复制。我也无法从nuget包文件夹复制,因为不同版本的Windows有不同的libSKiaSharp文件。 - user2481095
设置预构建事件怎么样? - Joel Lucsy
我也不能在预先构建事件中执行该操作,因为此时文件尚未复制到调试文件夹中。它们会在项目构建后复制。这令人沮丧,因为我知道我可以让它工作,但并不理想。 - user2481095
你能否进行两次构建,首先使用预构建,并将它们嵌入到第二次构建中吗? - MarkovskI

1
你尝试过以下方法吗:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <Costura>
    <IncludeAssemblies>
        libSkiaSharp
    </IncludeAssemblies>
  </Costura>
</Weavers>

2
当我添加这个时,构建失败,并显示以下错误:“Fody/Costura: 找不到程序集'libSkiaSharp'(即使CopyLocal='false'),请更新配置”。 - user2481095

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接