有没有一种方法可以让我在实际加载之前安全地检查组件是否可以加载



我正在开发一些软件,这些软件将为某些dll动态构建菜单项,以便我们可以根据用户机器上可用的dll动态加载组件。我要加载的任何dll都已在AssemblyInfo.cs文件中标记了Assembly属性,以及我如何确定是否要为该dll构建菜单项。到目前为止,我的方法是:

private void GetReportModules() {
foreach (string fileName in Directory.GetFiles(Directory.GetCurrentDirectory())) {
if (Path.GetExtension(fileName) == ".dll" || Path.GetExtension(fileName) == ".exe") {
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fileName);
object[] attributes = assembly.GetCustomAttributes(typeof(ReportNameAttribute), false);
if (attributes.Count() > 0) {
ReportNameAttribute reportNameAttribute = attributes[0] as ReportNameAttribute;
Type type = assembly.GetType(reportNameAttribute.BaseType);
MenuItem customReportsMenuItem = new MenuItem();
customReportsMenuItem.Header = reportNameAttribute.ReportName;
ReportsMenuItem.Items.Add(customReportsMenuItem);
customReportsMenuItem.Click += (s, ev) => {
var obj = Activator.CreateInstance(type);
type.InvokeMember("Show", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, obj, null);
};
}
}
}
}

在大多数情况下,它工作得很好,我得到了我期望的dll,并很好地创建了我的菜单项。问题是,为了检查属性,我首先需要使用反射加载程序集。当我试图加载其他一些本地dll时,它们会抛出有关缺少依赖项的错误,或者模块应该包含程序集清单。有没有一种方法可以让我在实际加载之前安全地检查组件是否可以加载?(我写出来的时候听起来很愚蠢)。对我遇到的问题有什么想法吗?或者对如何完成我在这里的努力有更好的建议吗?我有点不知所措。

您可以创建一个单独的AppDomain,尝试在那里加载程序集,将结果发回,然后卸载AppDomain。这样,您就不会使用任何已加载程序集的"垃圾"来更改当前AppDomain。

一种方法是使用try-catch块。如果它抛出是一个例外,你就不感兴趣了。。。

编辑:

MSDN清楚地解释了LoadFrom可以引发的异常类型。FileLoadException在您的情况下看起来很可能。

我确信有代码在捕获后继续执行。例如一个日志框架。我不希望我的框架捕获异常并使我的可执行文件停止等,我希望它能抑制异常。我的应用程序不应该仅仅因为一行日志未命中而失败。

您可以尝试非托管元数据API(http://msdn.microsoft.com/en-us/library/ms404384.aspx)或通用编译器基础结构元数据API(http://ccimetadata.codeplex.com/)作为普通反射的替代方案。

最新更新