无法找到当前域中的.NET程序集

时间:2010-12-14 17:36:13

标签: c# .net linq file-io

我有一个我正在工作的项目,它将搜索所有已加载的程序集以查找实现某个接口的任何类。然后它将创建该类的实例并调用接口的方法。代码在测试环境中的简单项目上运行得很好。它的核心是以下功能:

    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。显然两个组件之间存在差异。这是对的吗?

谢谢! 杰夫

2 个答案:

答案 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

好的,这就是我接触它的方式:

  • 使用sysinternal的procmon来监控您的可执行文件。你会看到文件的名称(objectbuilder2)弹出很多FILE NOT FOUND事件。看看它在哪里寻找它,你需要它在那里。我认为DLL正在加载到不同的位置
  • 确保此特定版本的DLL存在