我创建了一个新的 Windows Forms .NET v3.5 解决方案,并使用Visual Studio 上的Package Manager Console使用以下命令添加了 Patterns and Practices Unity引用:
为了简化,这个小应用程序除了尝试在它的加载方法中实例化一个UnityContainer 之外什么都不做:
private void Form1_Load(object sender, EventArgs e)
{
Stopwatch stopwatch = Stopwatch.StartNew();
new UnityContainer();
stopwatch.Stop();
Debug.WriteLine(String.Format("Winforms Unity initialization took {0}", stopwatch.Elapsed));
this.Close();
}
在 Windows 7 上,它运行迅速,进程在不到一秒的时间内退出。秒表日志显示实例化 Unity 不到一毫秒。
在带有 SP2 的 Windows XP 64 位中,我经历了30 秒的时间,直到这个小应用程序退出,但调试日志仍然显示实例化 Unity 的时间不到一毫秒。
所以我认为可能很长一段时间与 JIT 编译器从 Unity 的 IL 代码生成本机代码有关:
我使用ANTS Performance Profiler来确定哪些方法执行时间过长,发现 Form1_Load 方法总共需要 32 秒,
其中包含大约 30 秒的 JIT 开销,其中包含 30 秒的“等待同步”。
将鼠标悬停在它上面会显示一个工具提示,上面写着:
该节点显示正在执行的线程被阻塞了一段时间。例如,线程可能一直在休眠,或等待访问共享资源。
我想这意味着在 Windows XP 上加载/JITing Unity 需要很长时间。我也尝试使用 NGEN 创建小应用程序的原生镜像,但情况与不使用原生镜像相同。
有人知道 Unity 在 XP 中加载需要这么长时间吗?
DLL 是三个:
Microsoft.Practices.ServiceLocation.dll 30 KB
Microsoft.Practices.Unity.Configuration.dll 85 KB
Microsoft.Practices.Unity.dll 122 KB
它们正在发布,x86(这就是我从包管理器中获得它们的方式)