2

一些上下文

安装我的应用程序后,安装程序会为其部署的所有程序集调用 Ngen。这样做是为了减少启动时间,并且效果很好(它在我的机器上将时间从大约 22 秒减少到大约 14 秒)。它是一个 .NET 4.0 x86 WPF 应用程序,使用大约 40 个程序集(其中大部分是第三方的),所有程序集的大小约为 45 MB。

我现在将一些DependencyAttributes应用于我的代码以启用硬绑定(MSDN 中的解释)。这样做的原因是在启动期间已经加载了一些第三方程序集,否则在用户打开第一个数据输入窗口之前不会加载这些程序集。是的,我知道这会减慢我的应用程序的启动时间,但如果它减少了打开第一个数据输入窗口所需的时间,那就没问题了。

问题

1) 有什么方法可以检查加载的本机图像是作为硬绑定还是普通/软绑定加载的?

2)(如果第一个问题的答案是肯定的,我可以自己检查一下。)如果我有定义的 AssemblyA 和定义的[assembly: Dependency("AssemblyB", LoadHint.Always)]AssemblyB,[assembly: Dependency("AssemblyC", LoadHint.Always)]加载 AssemblyA 还会加载带有硬绑定的 AssemblyC(假设所有三个都有有效的本机图像) ? 还是我需要为所有依赖程序集指定直接硬依赖项?因为如果我这样做,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,版本 = 4.0.0.0,文化 = 中性,PublicKeyToken = 31bf3856ad364e35,因为依赖项没有本机图像(检查 FusLogVw 的原因)”。但是我确实有一个 PresentationFramework 的本机图像,并且使用 Fuslogvw 我可以看到它是在运行时加载的。安装本机图像后,ngen display /verbose甚至将 PresentationFramework 列为我的程序集的硬依赖项。那么这个警告是什么意思呢?

4

0 回答 0