我有一个我正在工作的项目,它将搜索所有已加载的程序集以查找实现某个接口的任何类。然后它将创建该类的实例并调用接口的方法。代码在测试环境中的简单项目上运行得很好。它的核心是以下功能:
public static List<Type> GetLoadedTypes(Type targetType)
{
var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(a => a.GetTypes())
.Where(t => targetType.IsAssignableFrom(t)).ToList();
return types;
}
我有另一个插入此代码的项目,LINQ查询失败,因为找不到域中的某个程序集。
System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Practices.ObjectBuilder,Version = 1.0.51206.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。
我不会在任何项目中直接引用此程序集。我怎样才能找出哪个组件引用它?如果无法找到,程序集如何进入域?
修改 我在项目中使用Enterprise Library,但我已经引用了Microsoft.Practices.ObjectBuilder2.dll。显然两个组件之间存在差异。这是对的吗?
谢谢! 杰夫
答案 0 :(得分:2)
您可以使用属于dotnet2.0sdk的“程序集绑定日志查看器”(Fuslogvw.exe)(也可能在更高版本中)。如果启用了日志记录,它可以显示已加载程序集以及哪个程序集导致它加载。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.80).aspx
答案 1 :(得分:1)
微软的 Unity 使用它。在构建时将DLL复制到bin(使用脚本,...)或添加引用。
<强>更新强>
为了找到答案,您可以添加AppDomain的AssemblyResolve事件并在参数中检查RequestingAssembly属性。
更新2
好的,这就是我接触它的方式: