Fody Costura не встраивает DLL SkiaSharp

Я создал решение, которое использует пакет NuGet Costura.Fody для объединения ссылочных сборок в качестве встроенных ресурсов. Я хочу это, чтобы я мог создать единственный exe-файл для своего приложения. Некоторое время это отлично работало, пока я не добавил ссылку на SkiaSharp (в частности, на пакеты Nuget SkiaSharp и SkiaSharp.Svg). LibSkiaSharp.dll не встроен, а вместо этого встроен в папку запускаемого проекта, и я не могу запустить программу exe самостоятельно, если я не сохраню dll в той же папке. Есть ли способ исправить это?

Вот шаги, чтобы воспроизвести это:

1. Создайте новый проект WPF
2. Добавьте пакеты nuget Costura.Fody и Fody.
3. Добавьте файл FodyWeavers.xml с содержимым установите это:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <Costura/>
</Weavers> 
  1. Создайте и запустите exe-файл в папке bin / Debug. Обратите внимание, что программа запустится, даже если вы переместите exe в новое место.
  2. Добавьте пакеты Nuget SkiaSharp и SkiaSharp.Svg.
  3. получить файл svg и добавить его в каталог проекта
  4. добавьте следующий код в свой конструктор MainWindow:

    var svg = новый SKSvg (); svg.Load ("image.svg"); SKCanvas canvas = новый SKCanvas (новый SKBitmap ()); canvas.DrawPicture (svg.Picture);

  5. обратите внимание, что если вы скопируете файл изображения и exe и поместите в другой каталог, exe не запустится. Это происходит из-за того, что он не может найти libSkiaSharp.dll.


person user2481095    schedule 09.10.2018    source источник
comment
Между прочим, я думаю, что причина этой проблемы связана с тем, что libSkiaSharp.dll является собственной библиотекой. Однако я попытался добавить ссылку на библиотеку в файл FodyWeavers.xml, используя тег IncludeAssemblies. Но пока не придумал, как заставить встраивать все dll.   -  person user2481095    schedule 10.10.2018


Ответы (2)


Создайте в своем проекте папку Costura32 и / или Costura64. Скопируйте libSkiaSharp.dll в соответствующий каталог в зависимости от его разрядности. Costura автоматически распакует и загрузит собственные двоичные файлы из этих каталогов.

person Joel Lucsy    schedule 10.10.2018
comment
Это было полезно, потому что это действительно работает. Однако, если бы я обновил пакет Nuget SkiaSharp, эти файлы могли бы быть устаревшими без ведома кого-либо. Добавление события после сборки для копирования файлов libSkiaSharp из папки отладки в папки Costura не сработает, потому что на файлы нужно ссылаться как на встроенные ресурсы. Успешная сборка зависит от наличия файлов, поэтому их нельзя скопировать после сборки. Я также не могу скопировать из папки пакета nuget, потому что для разных версий Windows существуют разные файлы libSKiaSharp. - person user2481095; 11.10.2018
comment
Как насчет настройки события перед сборкой? - person Joel Lucsy; 11.10.2018
comment
Я не могу выполнить событие перед сборкой, потому что в этот момент файлы не были скопированы в папку отладки. Они копируются после сборки проекта. Это расстраивает, потому что я знаю, что могу заставить это работать, но это не идеально. - person user2481095; 11.10.2018
comment
Можете ли вы сделать две сборки, начать с предварительной сборки и встроить их во вторую сборку? - person MarkovskI; 07.11.2018

Вы пробовали следующее:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <Costura>
    <IncludeAssemblies>
        libSkiaSharp
    </IncludeAssemblies>
  </Costura>
</Weavers>
person Nekeniehl    schedule 12.11.2018
comment
Когда я добавляю это, сборка завершается ошибкой: Fody / Costura: Сборка libSkiaSharp не может быть найдена (даже если CopyLocal = 'false'), обновите конфигурацию - person user2481095; 12.11.2018