Ссылочные сборки загружаются независимо от фактического пути кода (выполнения)? - PullRequest
0 голосов
/ 08 марта 2011

Сборки с обычной ссылкой не должны загружаться до тех пор, пока не будет использован определенный тип из этой сборки.Но вот вопрос:

Это приложение Winforms.Хотя ссылки на сборки PresentationFramework.dll и System.Xaml.dll указаны, их не следует загружать, поскольку приведенный ниже путь к коду никогда не выполняется;

bool useAutoHandler = false;

if (useAutoHandler) // This is always false so below code is not executed!
{
    var currentApplication = typeof(System.Windows.Application).GetProperty("Current");
    if (currentApplication != null)
    {
        var application = currentApplication.GetValue(this, null) as System.Windows.Application;
        if (application != null)
        {
            application.DispatcherUnhandledException += this.DispatcherUnhandledException;
        }
    }
}

Когда я запрашиваю загруженные сборки с помощью AppDomain.CurrentDomain.GetAssemblies (),Я вижу, как загружается ядро ​​платформы представления и xaml.Есть идеи, почему это так?

Ответы [ 2 ]

3 голосов
/ 31 июля 2012

Ссылочная сборка загружается в память процесса перед тем, как войти в метод, в котором есть ссылка.

Если вы измените свой код на что-то вроде этого:

private void Foo()
{
  var currentApplication = typeof(System.Windows.Application).GetProperty("Current");
  if (currentApplication != null)
  {
    var application = currentApplication.GetValue(this, null) as    System.Windows.Application;
    if (application != null)
    {
      application.DispatcherUnhandledException += this.DispatcherUnhandledException;
    }
  }
}

public void Bar(bool useAutoHandler)
{
  if (useAutoHandler)
  {
    Foo();
  }
}

, затем запустите Bar(false)не должен загружать дополнительные сборки.

3 голосов
/ 08 марта 2011

Вы загружаете сборку PresentationFramework.dll в этой самой строке: typeof(System.Windows.Application), потому что вы статически ссылаетесь на тип, содержащийся в этой сборке.

Если вы скомпилируете это в режиме выпуска, компилятор, вероятно, оптимизируетэтот код и полностью удалить этот if из полученного IL.Если тело оператора if является частью результирующего IL во время выполнения, когда наступает момент для выполнения метода, содержащего этот код, JIT необходимо будет преобразовать его в машинный код и поскольку вы статически ссылаетесь на тип вДля этой сборки потребуется загрузить соответствующую сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...