Встраивание dll в exe с поддержкой Mono с Fody - PullRequest
0 голосов
/ 29 мая 2018

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

Так, как я могу использовать 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'

1 Ответ

0 голосов
/ 30 декабря 2018

Используйте этот код в начале 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/

...