我需要从目录中的DLL加载所有程序集。
我的基本代码是:
var assemblies = from filename in Directory.GetFiles(HttpRuntime.BinDirectory, "*.dll")
select Assembly.LoadFrom(filename);
但是,如果该目录中存在非托管DLL,则Assembly.LoadFrom将失败。有没有一种只加载托管DLL的好方法?捕获加载异常是一种选择,但我想知道是否有更好的方法。
我的代码在应用程序启动时在ASP.NET上运行。所以我也会接受ASP.NET特定的解决方案。
答案 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,则它不是程序集。