在使用该程序集中的特定类型之前,不应加载常规引用的程序集。但这是一个问题:
这是一个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。关于为什么会出现这种情况的任何想法?
答案 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将需要将其转换为机器代码,因为您已静态引用了在这个程序集中输入它需要加载相应的程序集。