确定哪个dll / exe是我的应用程序的有效模块

时间:2012-09-26 20:35:05

标签: c# wpf dll module .net-assembly

我正在研究一些支持使用报告模块的软件。基本上我们不希望默认发送所有报告,因为它只是创建了不必要的膨胀,所以我正在寻找一种有效的方法来检查当前的exe和dll是否可以通过在运行时动态添加的有效模块。到目前为止,我已尝试在AssemblyInfo中设置自定义属性,并将其用作标志,如下所示:

private void GetReportModules() { 
        try {
            var dlls = Directory.GetFiles(Directory.GetCurrentDirectory()).Where(x => Path.GetExtension(x) == ".dll" || Path.GetExtension(x) == ".exe");
            dlls = dlls.OrderBy(x => Path.GetFullPath(x)).Where(x => {
                try {
                    return null != System.Reflection.Assembly.LoadFrom(x);
                } catch (Exception) {
                    Console.WriteLine("Skipping {0} - does not load using reflection.", Path.GetFileName(x));
                    return false;
                }
            });

            foreach (var dll in dlls) {
                System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(dll);
                object[] attributes = assembly.GetCustomAttributes(typeof(ReportNameAttribute), false);
                if (attributes.Count() > 0) {
                    // dynamically include the assembly as a menu item
                }
            }

        } catch (Exception ex) { throw new GenericException(ex); }
    }

问题是我真的必须加载每个dll和exe两次,这似乎不是很有效。任何人都可以提出一种方法,他们之前已经完成了类似的事情或改善我正在做的事情吗?

如果我可以检查属性而不需要先加载程序集,那将是非常棒的。

1 个答案:

答案 0 :(得分:2)

反思有成本。通常情况下,如果你只做一次就不会太贵(记得缓存结果。如果需要不时刷新它们,你可以使用计时器)。

如果您不想加载所有程序集并进行检查,则可以使用配置文件,其中用户必须明确定义应加载的内容。

您还可以设置一个特殊的文件夹,该文件夹应仅包含与此内容相关的dll,根据定义 - 此文件夹中的任何内容都是您要加载的内容。