【问题标题】:.NET assembly in current domain cannot be found找不到当前域中的 .NET 程序集
【发布时间】:2010-12-14 17:36:12
【问题描述】:

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

    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,版本=1.0.51206.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。

我没有在我的任何项目中直接引用这个程序集。如何找出引用它的程序集?如果找不到,程序集是如何进入域的?

编辑: 我在项目中使用企业库,但我已经在引用 Microsoft.Practices.ObjectBuilder2.dll。显然这两个组件之间存在差异。对吗?

谢谢! 杰夫

【问题讨论】:

    标签: c# .net linq file-io


    【解决方案1】:

    您可以使用属于dotnet2.0sdk的“Assembly Binding Log Viewer”(Fuslogvw.exe)(可能也在以后的版本中)。如果启用了日志记录,它可以向您显示加载了哪些程序集以及导致它加载的程序集。

    详情见http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.80).aspx

    【讨论】:

    • 我无法得到这个产生任何结果。它适用于.net 3.5吗?设置部分未启用日志记录(所有字段均已禁用)。您知道如何启用它们吗?谷歌搜索几个不同的术语以找出没有任何结果。
    • 你必须设置一个自定义的日志位置,否则它似乎不起作用:automaticchainsaw.blogspot.com/2007/11/…
    • 这成功了! fuslogvw.exe 向我展示了哪个程序集正在加载丢失的程序集,事实证明我不需要在我的项目中引用那个有问题的程序集。删除了参考,一切正常!谢谢!
    • 在我启动并运行 fuslogvw 后,我意识到我可以创建一个注册表项来将日志消息添加到 asp.net 错误页面:HKLM\Software\Microsoft\Fusion!EnableLog (DWORD)设置为 1 现在我也终于明白那个错误信息了!两只鸟,一块石头。
    【解决方案2】:

    这由 Microsoft 的 Unity 使用。在构建时将 DLL 复制到您的 bin(使用脚本,...)或添加引用。


    更新

    为了找出答案,您可以添加 AppDomain 的 AssemblyResolve 事件并检查参数中的 RequestingAssembly 属性。


    更新 2

    好的,这就是我的处理方式:

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

    【讨论】:

    • 我使用的是 .NET 3.5,所以很遗憾 RequestingAssembly 属性对我不可用。另外,请参阅我对原始问题的更新。我没有使用 Unity,但我使用的是 Enterprise Library。我引用了 ObjectBuilder2.dll 程序集,但解决此程序集没有任何区别。
    • @Jeff,这从 1.1 版开始可用,所以你绝对可以使用它。 msdn.microsoft.com/en-us/library/…
    • 对。我能够重载事件,但事件参数没有 RequestingAssmbly 属性。从您最初链接到的 MSDN 页面:“从 .NET Framework 版本 4 开始,ResolveEventArgs..::.RequestingAssembly 属性返回请求无法解析的程序集加载的程序集。”在调试器中检查对象确认 3.5 中没有 RequestingAssembly。在 3.5 中,ResolveEventArgs 只有一个 Name 属性。
    • 好的。我又给出了几点,希望对你有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多