【发布时间】: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 代码的哪一部分。
-
@poke see - stackoverflow.com/questions/11915389/…
-
这是完全不同的问题(并且与您看到的异常无关) - LINQ 查询是惰性的,实际上您会在实际执行查询时看到异常(即在
ToList或在您的情况下启动foreach时)。
标签: c# .net reflection