c# - 有没有一种方法可以让我在实际执行之前安全地检查是否可以加载程序集?

标签 c# wpf reflection dll .net-assembly

我正在开发一些可以为某些 dll 动态构建菜单项的软件,这样我们就可以根据用户计算机上可用的 dll 动态加载组件。我要加载的任何 dll 都已在 AssemblyInfo.cs 文件中标记有程序集属性,以及我如何确定是否要为该 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 时,它们会抛出有关缺少依赖项的错误,或者他的模块应该包含程序集 list 。有没有一种方法可以让我在实际执行之前安全地检查是否可以加载程序集? (我写出来时听起来很愚蠢)。关于我遇到的问题的任何想法或关于如何完成我在这里尝试的更好的建议?感觉有点头疼。

最佳答案

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

关于c# - 有没有一种方法可以让我在实际执行之前安全地检查是否可以加载程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12588863/

相关文章:

c# - 在 Mac OS X 上学习 ASP.NET MVC

java - 为接口(interface)创建代理,可以通过@Autowired注入(inject),代理通过关键参数调用不同的实现

java - "org.reflections.Reflections - could not get type for name"当对包含 groovy 类的包使用反射时

c# - 数据绑定(bind)到最初为空的对象

java - 反射是否要求在字节码中写入文字字符串?

c# - 条件断点不起作用

c# - 在创建用户时测试 ASP.NET 成员资格提供程序重复电子邮件

控制台应用程序的 C# 箭头键输入

c# - 窗口最小化后不恢复

c# - WPF 将 ViewModel 属性绑定(bind)到附加属性