Asp.net mvc ASP.NET MVC BuildManager.GetAssemblys()

Asp.net mvc ASP.NET MVC BuildManager.GetAssemblys(),asp.net-mvc,reflection,.net-assembly,Asp.net Mvc,Reflection,.net Assembly,我在ASP.NET MVC 4应用程序中工作,在应用程序启动时,我正在使用BuildManager获取所有引用的程序集。我正在查看应用程序中的所有类型,以找到我想要的一些类型(它是动态的,所以在启动之前我不知道需要什么类型) 基本上,我的代码如下所示: var allTypes = BuildManager.GetReferencedAssemblies() .Cast<Assembly>() .SelectMa

我在ASP.NET MVC 4应用程序中工作,在应用程序启动时,我正在使用BuildManager获取所有引用的程序集。我正在查看应用程序中的所有类型,以找到我想要的一些类型(它是动态的,所以在启动之前我不知道需要什么类型)

基本上,我的代码如下所示:

var allTypes = BuildManager.GetReferencedAssemblies()
                  .Cast<Assembly>()
                  .SelectMany(a => a.GetTypes());
var allTypes=BuildManager.getReferencedAssemblys()
.Cast()
.SelectMany(a=>a.GetTypes());
我在应用程序启动时调用它,但也在每个新请求的开头调用它,以便动态查找类型

因此,我的问题是:

  • 由于ASP.NET在需要程序集之前不会加载程序集,因此通过调用
    BuildManager.getReferenceAssemblys()
    是否在需要程序集之前加载所有程序集并导致性能问题
  • 对于每个请求,迭代所有类型是一个坏主意吗?我可以缓存类型,但ASP.NET可以在缓存完程序集后动态加载程序集,对吗?如果是这样的话,我可能会错过一些确实存在的类型

  • 谢谢

    不要每次请求都进行缓存:尽可能早地进行缓存;反射很慢

    预加载所有程序集,并在应用程序启动时进行;我有一个系统,我在我们的很多网站上使用它,它必须根据部署的程序集做很多动态的事情,我在启动时做所有的工作

    是的,因此启动速度较慢,但这比每个请求花费更长时间的问题要少

    然后,您很可能会对我刚才提出并回答的一个问题感兴趣,该问题涉及如何可靠地预加载所有已部署的程序集:


    直到今天,我仍然使用相同的过程,它就像一个符咒一样工作。

    不要每次请求都这样做:尽早缓存;反射很慢

    预加载所有程序集,并在应用程序启动时进行;我有一个系统,我在我们的很多网站上使用它,它必须根据部署的程序集做很多动态的事情,我在启动时做所有的工作

    是的,因此启动速度较慢,但这比每个请求花费更长时间的问题要少

    然后,您很可能会对我刚才提出并回答的一个问题感兴趣,该问题涉及如何可靠地预加载所有已部署的程序集:


    到今天为止,我仍然使用相同的过程,效果非常好。

    谢谢!似乎
    BuildManager.GetAllAssemblies()
    可以加载所有东西,甚至是动态程序集。因此,如果我在启动时迭代并缓存结果,这是否会有效地“预加载”,这样我就不必手动进行预加载?对于网站来说,似乎确实如此,所以是的,您应该能够依靠它来获取网站的所有已部署程序集。如果您迭代它们并开始询问它们,那么肯定是的,它将预加载它们(在某种程度上,JIT仍然只会在需要时在内存中编译所需内容)。谢谢!似乎
    BuildManager.GetAllAssemblies()
    可以加载所有东西,甚至是动态程序集。因此,如果我在启动时迭代并缓存结果,这是否会有效地“预加载”,这样我就不必手动进行预加载?对于网站来说,似乎确实如此,所以是的,您应该能够依靠它来获取网站的所有已部署程序集。如果您迭代它们并开始询问它们,那么肯定是的,它将预加载它们(在某种程度上,JIT仍然只在需要时在内存中编译所需内容)。