仅在目录中加载托管程序集DLL

时间:2011-08-31 13:42:03

标签: .net asp.net

我需要从目录中的DLL加载所有程序集。

我的基本代码是:

var assemblies = from filename in Directory.GetFiles(HttpRuntime.BinDirectory, "*.dll")
                 select Assembly.LoadFrom(filename);

但是,如果该目录中存在非托管DLL,则Assembly.LoadFrom将失败。有没有一种只加载托管DLL的好方法?捕获加载异常是一种选择,但我想知道是否有更好的方法。

我的代码在应用程序启动时在ASP.NET上运行。所以我也会接受ASP.NET特定的解决方案。

4 个答案:

答案 0 :(得分:5)

分别循环浏览它们并将Assembly.LoadFrom放在try...catch块中。

答案 1 :(得分:4)

从这里开始:http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68334.aspx

如果给定文件不是托管程序集,则Assembly.LoadFrom将抛出BadImageFormatException。

由于其他原因,也可能抛出此异常。 Suzanne善意地指出了一种更强大的方式。捕获BadImageFormatException后,查看其HResult字段。如果HResult是COR_E_ASSEMBLYEXPECTED,则表示这不是托管程序集。“

这有帮助吗?

答案 2 :(得分:3)

一些谷歌搜索引导我到这个页面:Detect if an assembly is a managed assembly。这听起来很合适。

这真的取决于你期望的多少非托管dll以及你对启动时间的敏感程度(我假设你在启动时这样做)。如果您可以放松这两个帐户,try...catch肯定是最简单的事情,否则,阅读汇编标题信息应该快几个数量级。

答案 3 :(得分:1)

调用GetAssemblyName(),如果它抛出BadImageFormatException,则它不是程序集。