无论实际代码(执行)路径如何,引用的程序集都会加载?

时间:2011-03-08 19:15:05

标签: c# .net lazy-loading .net-assembly

在使用该程序集中的特定类型之前,不应加载常规引用的程序集。但这是一个问题:

这是一个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 个答案:

答案 0 :(得分:3)

在进入存在引用的方法之前,引用的程序集正在加载到进程内存中。

如果您将代码更改为以下内容:

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)不应加载额外的程序集。

答案 1 :(得分:2)

您正在同一行中加载PresentationFramework.dll程序集:typeof(System.Windows.Application),因为您静态地引用了此程序集所包含的类型。

如果在发布模式下编译它,编译器可能会优化此代码并从生成的IL中完全删除此if。如果if语句的主体是运行时生成的IL的一部分,当包含此代码的方法的时刻到来时,JIT将需要将其转换为机器代码,因为您已静态引用了在这个程序集中输入它需要加载相应的程序集。