【问题标题】:Load all types from all assembly in project从项目中的所有程序集中加载所有类型
【发布时间】:2016-02-23 17:15:46
【问题描述】:

我正在尝试搜索属于我的项目引用的所有程序集的所有类型

我做了什么,通过这个加载我项目中的所有程序集:

var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var loadedPaths = loadedAssemblies.Select(a => a.Location).ToArray();

 var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
                var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList();
                toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));

然后搜索具体类型

const string @namespace = "name space to search"

 var   types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes())
                .Where(t => t.IsClass && t.Namespace == @namespace );

现在当我尝试迭代类型时,我得到一个加载程序异常 "无法加载文件或程序集 'System.Windows"

并且 system.windows 不是我的项目所引用的程序集

编辑:

执行以下操作时抛出异常

foreach(类型中的 var 类型) { }

【问题讨论】:

  • 我不明白。你从哪里得到错误?显示您的堆栈跟踪。
  • @poke - 当某些程序集具有无法解析的引用时,这是一个相当标准的错误(已经问过很多次了)。调用堆栈对一般版本的问题没有帮助,因为每种情况都特定于特定的 DLL 集。并且基于 LINQ 的迭代的堆栈大多是无用的 - 需要使用 try/catch 手动执行 foreach 以获得具有跳过逻辑的有用信息。
  • @AlexeiLevenkov 我问主要是因为我不知道错误发生在 OP 代码的哪一部分。
  • 这是完全不同的问题(并且与您看到的异常无关) - LINQ 查询是惰性的,实际上您会在实际执行查询时看到异常(即在ToList 或在您的情况下启动 foreach 时)。

标签: c# .net reflection


【解决方案1】:

这就是我最终的结果,失败的原因是我的 dll 目录,比我的项目直接引用的 dll 多。

var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();

loadedAssemblies.SelectMany(x => x.GetReferencedAssemblies())
                .Distinct()
                .Where(y => loadedAssemblies.Any((a) => a.FullName == y.FullName) == false)
                .ToList()
                .ForEach(x => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(x)));

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多