某些背景
安装我的应用程序后,安装程序会为其部署的所有程序集调用Ngen。这样做是为了减少启动时间并且运行良好(它将我的机器上的时间从大约22秒减少到大约14秒)。它是一个.NET 4.0 x86 WPF应用程序,使用大约40个程序集(大多数是第三方),所有程序集的大小约为45 MB。
我现在在代码中应用了一些DependencyAttributes来启用硬绑定(explanation in MSDN)。这样做的原因是在启动期间已经加载了一些第三方程序集,否则在用户打开第一个数据输入窗口之前不会加载这些程序集。是的我知道这会减慢我的应用程序的启动时间,但如果它减少了打开第一个数据输入窗口所需的时间,这是可以的。
问题
1)有没有办法检查加载的本机图像是作为硬绑定还是普通/软绑定加载?
2)(如果第一个问题的答案是肯定的,我可以自己查看。)如果我有定义[assembly: Dependency("AssemblyB", LoadHint.Always)]
的AssemblyA和定义[assembly: Dependency("AssemblyC", LoadHint.Always)]
的AssemblyB,那么加载AssemblyA也会加载AssemblyC使用硬绑定(假设所有三个都有有效的原生图像)?或者我是否需要为所有dependend程序集指定直接硬依赖项?因为如果我执行ngen display /verbose
那些间接依赖项不会被列为直接硬依赖项,而只会作为依赖项的硬依赖项。
3)我刚刚发现如果程序集没有直接用在我的程序集中,我就无法将程序集定义为硬依赖项(来自ngen install /verbose
的消息:警告:不能硬绑定到ThirdPartyAssemblyB,因为它没有加载)。所以我的项目引用了ThirdPartyAssemblyA和ThirdPartyAssemblyB,但是没有使用ThirdPartyAssemblyB中的任何类。但是在运行时仍然需要ThirdPartyAssemblyB,因为ThirdPartyAssemblyA使用它。使用.NET Reflector我可以看到编译器删除了对ThirdPartyAssemblyB的引用。使用ngen display /verbose
我可以看到我的程序集没有直接依赖于ThirdPartyAssemblyB,既不硬也不软。当然它仍然对ThirdPartyAssemblyA(这是一个硬依赖)有间接依赖,但由于ThirdPartyAssemblyA没有对ThirdPartyAssemblyB的硬依赖,这没有帮助。我是否真的需要创建一些直接引用ThirdPartyAssemblyB的虚拟代码才能获得硬绑定?
4)由于某种原因ngen install MyAssembly /verbose
打印出以下警告:“警告:无法硬件绑定到PresentationFramework,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35因为依赖项没有本机映像(请检查FusLogVw因为理由)“。但我做拥有PresentationFramework的原生图像并使用Fuslogvw我可以看到它是在运行时加载的。安装本机映像ngen display /verbose
后,甚至将PresentationFramework列为我的程序集的硬依赖项。那么这个警告意味着什么?