Выполнить код как можно скорее (прежде чем что-либо из стороннего кода) в настольном приложении (winforms или wpf)? - PullRequest
0 голосов
/ 01 июня 2018

Это действительно необходимо, потому что какой-то сторонний код, такой как log4net , может каким-то образом запускать свой код даже перед статическим конструктором Программы ?

Я пытался встроить log4net.dll в качестве ресурса проекта и динамически загружать его при необходимости, используя обработчик событий для AppDomain.AssemblyResolve.Однако самый быстрый пункт в программе, который я могу здесь вставить, находится в статическом конструкторе Программы (для регистрации обработчика событий):

static class Program {
     static Program(){
         AppDomain.CurrentDomain.AssemblyResolve += (s,e) => {
             //...
         };
     }
}

Но log4net каким-то образом даже задействован / указан ранееэта точка и это означает, что она не может быть динамически загружена, если не найдена какая-либо необработанная dll, будет выдано исключение FileNotFoundException.

Не могли бы вы дать мне несколько советов о том, что мы можем сделать в этом случае для запуска некоторого кода еще до log4net ?или вообще как то что я просил, как можно скорее?

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете внедрить код еще до этого, но не напрямую - VS не позволяет этого самостоятельно.Вы должны сделать это на уровне IL (вручную изменяя код IL) или использовать некоторые сторонние инструменты, которые могут сделать это - например, Fody ModuleInit weaver.

Что он делает, он внедрит вашкод в код модуля - тот, который отображается в дизассемблерах как <Module>.Этот код будет выполняться при загрузке вашего модуля, так что он будет до статического ctor.

Имея такой код:

using System;

namespace ConsoleApp3
{
  class Program
  {
      static Program()
      {
          Console.WriteLine("static ctor of Program");
      }
      static void Main(string[] args)
      {
          Console.WriteLine("Main");
      }
  }

  public static class ModuleInitializer
  {
      public static void Initialize()
      {
          Console.WriteLine("Module Initializer");
      }
  }
}

и Fody & Module Init как nuget пакетовУстановленный даст

enter image description here

Кроме того, у Fody есть модуль, который делает то, что вам нужно - Costura может упаковать всевнешние зависимости в ресурсы.

...