Встраивание dll в exe с поддержкой Mono с помощью Fody

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

Итак, как я могу использовать Fody (Costura), а также поддерживать моно-совместимость. Их документы на https://github.com/Fody/Costura#contents гласят:

CosturaUtility - это класс, который дает вам доступ к инициализации системы Costura вручную в вашем собственном коде. Это в основном для сценариев, в которых инициализатор модуля не работает, например для библиотек и Mono.

Для использования вызовите CosturaUtility.Initialize () где-нибудь в коде как можно раньше.

class Program {
    static Program() {
        CosturaUtility.Initialize();
    }

    static void Main(string[] args) { ... }
}

но даже после инициализации ConturaUtility вручную он не поддерживает монофоническую среду выполнения.

Не думаю, что журнал ошибок актуален, но вот он:

Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32' or one of its dependencies.
File name: 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32' or one of its dependencies.
File name: 'CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32'

person Rishav    schedule 29.05.2018    source источник


Ответы (1)


Используйте этот код в начале Main () в вашей программе:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
   String resourceName = "AssemblyLoadingAndReflection." +
      new AssemblyName(args.Name).Name + ".dll";
   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
      Byte[] assemblyData = new Byte[stream.Length];
      stream.Read(assemblyData, 0, assemblyData.Length);
      return Assembly.Load(assemblyData);
   }
};

Ссылка: https://blogs.msdn.microsoft.com/microsoft_press/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition/

person tambeen    schedule 30.12.2018