C# 为什么某些.Net程序集无法通过AppDomain';s getAssemblys()方法?

C# 为什么某些.Net程序集无法通过AppDomain';s getAssemblys()方法?,c#,.net,reflection,assemblies,appdomain,C#,.net,Reflection,Assemblies,Appdomain,我有一点代码,可以循环遍历当前加载到ASP.NET应用程序中运行的AppDomain中的类型。以下是我获取程序集的方法: var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 当应用程序第一次启动时,没有问题,我期望的所有类型都存在。但是,当我更新Web.config或终止w3p.exe进程(或者该进程因任何原因被回收)时,只有一些我期望的类型可用。当我逐步使用调试器时,我注意到私有搜索路径(我的应用程序的bin目录)中的某些程序集

我有一点代码,可以循环遍历当前加载到ASP.NET应用程序中运行的AppDomain中的类型。以下是我获取程序集的方法:

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
当应用程序第一次启动时,没有问题,我期望的所有类型都存在。但是,当我更新Web.config或终止w3p.exe进程(或者该进程因任何原因被回收)时,只有一些我期望的类型可用。当我逐步使用调试器时,我注意到私有搜索路径(我的应用程序的bin目录)中的某些程序集尚未加载。我假设所有程序集都是在应用程序启动和重新启动时加载的,无论是否立即需要它们。但是在重新启动的情况下,除非这些程序集文件已经更新,否则这种情况似乎不会发生


我需要的是在启动时收集类型信息,以便以后使用。但是,由于在重新启动期间,类型不可用,因此在以后需要使用类型信息时,它会发出一股混乱的气味。因此,考虑到这一点,我如何解决或解决这一缺陷?

程序集是按需加载的,因此可能是您尚未使用这些程序集中包含的任何类型。

作为启动的一部分,您是否可以使用您关心的程序集

您必须提前知道需要哪些组件

扫描文件系统以找出哪些程序集随应用程序一起提供可能是一个有用的想法,但这对GAC加载的程序集没有帮助…

您可以使用

AssemblyName[] assemblies = Assembly.GetCallingAssembly().GetReferencedAssemblies();

这样,您就可以从调用这些方法的程序集中获取引用的所有程序集。

没错,我在应用程序启动时没有加载任何类型。问题是我需要应用程序启动时的类型信息,以便以后可以使用该信息。如果启动时信息不可用,则应用程序可能会在稍后崩溃。您可以使用静态方法Assembly.Load()确保在需要时加载所有必需的程序集。我无法使用Aseembly.Load(),因为我没有可用的程序集名称。你可能想看看纳德的答案,看看我在哪里。我正在考虑显式加载程序集。到目前为止,我只需要私有程序集,这样我就可以从私有搜索路径加载所有内容。不过,我不确定哪种方式是实现这一目标的最佳方式。装配,装载?Assembly.LoadFile?Assembly.LoadFrom?Assembly.Load通常是首选方法,因为它最接近正常加载机制。请参阅,了解优点和缺点,以及更多信息。感谢您提供的链接,我已经看过了。我想我必须使用LoadFrom或LoadFile,因为我只有文件路径可以使用。我知道在使用LoadFile之前,在部署过程中更新程序集时会遇到问题,因为程序集文件可能被LoadFile锁定。我认为LoadFrom对我来说是正确的,但我不确定我是否完全理解它的含义。如果您只需要使用路径,您可以检查这些程序集以找出路径吗?获得正确的绑定上下文非常重要。此外,对于文件锁定问题,您应该在部署时关闭应用程序池-这将关闭IIS进程并防止锁定。如果您不想这样做,另一个选项是执行ASP.NET所做的操作:创建卷影副本(),再次感谢。我只是不确定如何确定哪个绑定上下文适合我。到目前为止,LoadFrom正在工作,我已经尽可能地验证了我是否具有预期的行为。但话说回来,在我发现自己有这个问题之前,情况就是这样虽然我的调用程序集不一定引用我要找的类型,但它们可能被你的程序集引用的另一个程序集引用。您可以遍历间接引用程序集的整个树,以获得所需的所有程序集/类型。啊,我明白了。我可以做到。我必须看看这对启动时间的贡献。谢谢。事实证明我不能这样做,因为调用程序集甚至执行程序集都没有,甚至间接地,引用我感兴趣的类型。