我已经加载了一些加载需要一段时间才能加载的程序集,因为它们是具有大文件大小的第三方框架。为了消除第一次在应用程序中访问使用它们时的暂停,我决定让它们在应用程序启动时加载。事实上,为了通常提高性能(这里没有内存问题),我决定让AppDomain
的所有引用程序集通过Assembly.Load
及其依赖项递归加载(使用代码来避免重复,等等)。 )。
一切正常。
我正在重构代码以使用自定义的AssemblyInfo对象,以便我可以存储有关加载的程序集的更多信息,我有一个想法。
当您引用Assembly
类型对象时,该程序集是否已加载到内存中?如果是这样,那么我需要做的就是维护每个程序集的实时引用,而不是将Assembly.FullName
并将其提供给Assembly.Load
,这将是一个多余的练习,因为我们已经有了Assembly
个对象。
现在,我们从Assembly
获取AppDomain
个对象的方式是AppDomain.Current.GetAssemblies();
,我查看了参考源,发现这会调用extern
函数:< / p>
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern Assembly[] nGetAssemblies(bool forIntrospection);
不幸的是,我无法在兔子洞中追逐这一点,因为没有任何对nGetAssemblies的引用似乎在CoreCLR源或其他地方,而不是AppDomain和其他一些奇怪的(但看起来不相关)的地方。
有人知道以下任何信息吗?
Assembly
对象与运行Assembly.Load
一样好(甚至是多余的?)Assembly
对象在通过AppDomain.Current.GetAssemblies()
获取后可以继续使用?AppDomain
中的所有程序集,然后递归加载所有的依赖项并跟踪已加载的内容以避免再次尝试加载相同的内容?