程序集参考+变量与Assembly.Load

时间:2016-12-21 18:52:41

标签: c# .net .net-assembly appdomain system.reflection

我已经加载了一些加载需要一段时间才能加载的程序集,因为它们是具有大文件大小的第三方框架。为了消除第一次在应用程序中访问使用它们时的暂停,我决定让它们在应用程序启动时加载。事实上,为了通常提高性能(这里没有内存问题),我决定让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和其他一些奇怪的(但看起来不相关)的地方。

有人知道以下任何信息吗?

  1. 是否拥有Assembly对象与运行Assembly.Load一样好(甚至是多余的?)
  2. 如果Assembly对象在通过AppDomain.Current.GetAssemblies()获取后可以继续使用?
  3. 其中nGetAssemblies是,所以我可以阅读它的代码吗?
  4. 如果有更好的方法来执行此操作,而不是加载AppDomain中的所有程序集,然后递归加载所有的依赖项并跟踪已加载的内容以避免再次尝试加载相同的内容?

0 个答案:

没有答案