Попытка создать приложение WinForms со всеми включенными вспомогательными сборками ресурсов

Я использую VS 2013 для создания приложения C # WinForms, которое поставляется в виде одного EXE-файла. До сих пор это не было проблемой с использованием ilmerge в качестве этапа после сборки, чтобы включить все необходимые библиотеки DLL. Даже компоненты ActiveX можно без проблем встраивать.

Но теперь я собираюсь интернационализировать приложение, что приведет к созданию локализованных сборок вспомогательных ресурсов. Мое текущее решение выглядит следующим образом:

  1. Сборка генерирует DLL под (например) ....._ 1_
  2. Действие после сборки копирует эту DLL в ..\..\Resources\i18n\en

В следующий раз, когда выполняется сборка, она встраивает ресурс в папку ресурсов i18n\en как встроенный ресурс в целевой объект. В своем приложении я использую свой собственный ResolveEventHandler для события AppDomain.CurrentDomain.AssemblyResolve, читая запрошенную DLL из внутренних ресурсов приложения.

Это работает нормально, НО: после фиксации изменений, связанных с локализованной DLL, мне нужно дважды построить решение, чтобы поместить новую DLL в выходной EXE.

Использование ilmerge для включения вспомогательных сборок не удалось, поскольку оно распаковывает библиотеки DLL и помещает содержащиеся в них объекты непосредственно в EXE-файл.

Итак, мой вопрос заключается в том, могу ли я изменить файл .csproj таким образом, чтобы после создания DLL я мог скопировать его в каталог ресурсов до, когда ресурсы были упакованы в выходной двоичный файл вместо копирования после первой сборки. Таким образом, потребуется всего один проход сборки и можно будет избежать ошибок.


person Stefan    schedule 30.05.2014    source источник


Ответы (1)


Теперь он работает, но другим способом, чем я искал изначально.

Вместо того, чтобы встраивать DLL как встроенный ресурс с помощью Visual Studio / MS Build, я создал инструмент ResourceEmbedder для последующего встраивания ресурсов. Для этого он использует Mono.Cecil. Итак, теперь механизм:

  1. Создайте целевой EXE-файл стандартным способом VS.
  2. После сборки: используйте инструмент ResourceEmbedder, чтобы встроить все вспомогательные сборки.
  3. После сборки: используйте ilmerge, чтобы встроить все внешние библиотеки DLL.
  4. Во время выполнения подключитесь к событию AppDomain.CurrentDomain.AssemblyResolve, чтобы при необходимости предоставить вспомогательные сборки.
person Stefan    schedule 30.05.2014