引用的程序集未找到 - 如何获取包含在解决方案中的所有DLL

5
我正在运行一个名为CoreApplication的WCF应用程序,其VS项目引用了AncillaryProjectCoreApplication使用来自AncillaryProjectProvider类;但是,它从未被显式引用-通过反射调用它。
我的问题是,有时候CoreApplication找不到Provider,因为在对GetAssemblies()的调用中没有提及AncillaryProject。有时它工作得很好,但有时(我猜可能是在JIT之后)它会失败。
这是我的原始代码:
var providers = from d in AppDomain.CurrentDomain.GetAssemblies()
                from c in d.GetTypes()
                where typeof(BaseProvider).IsAssignableFrom(c)
                select c;

在查看了这个问题之后,我尝试使用GetReferencedAssemblies()

var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
    allAssemblies = allAssemblies.Union(
                          a.GetReferencedAssemblies()
                           .Select(b => System.Reflection.Assembly.Load(b)));
}
var providers = from d in allAssemblies
                from c in d.GetTypes()
                where typeof(BaseProvider).IsAssignableFrom(c)
                select c;

我意识到我参考的问题通过动态加载bin目录中的所有dll文件来解决问题,但这对我来说并不是特别好。 有更好的方法吗,还是.NET根本就没有加载其他程序集?这是如何在内部处理的,我能做些什么吗?


1
它不会完全回答你的问题,但是在我的回答中有一些相关信息:http://stackoverflow.com/questions/9947882/get-assemblies-without-instantiating-them/9948404#comment12730056_9948404 除了注意到VisualStudio中的“引用”程序集在运行时并没有什么意义之外,下面关于使用Fusion Logger的答案也是一个很好的帮助。你应该能够将AncillaryProject.dll复制到Fusion正在查找程序集的任何位置,但它可能会提供一些关于它正在查找的位置的答案。 - CodingWithSpike
啊 - 这正是我需要知道的信息。 - eouw0o83hf
对于任何发现这个问题的人的后续:在提问后的这几年里,我意识到我的做法完全错误。有时候不那么神奇,并明确列出你想要的“Type”是更好的选择,这是其中之一。 - eouw0o83hf
3个回答

9
根据微软文档,AppDomain.CurrentDomain.GetAssemblies()获取已加载到此应用程序域的执行上下文中的程序集。关于AppDomain.CurrentDomain.GetAssemblies() 看起来您需要更改加载所需程序集的策略,从使用应用程序域转而查找应用程序文件夹中的dll。
我在一个类似问题的讨论中找到了一些信息here

是的,那描述得很完美。谢谢。 - eouw0o83hf

3

3
你应该下载 .NET 开发 SDK 并启动 FuslogVw.exe (融合日志查看器)。它会报告 CLR 应用程序尝试解析 .NET 依赖项的情况。它将向您显示它正在查找的位置以及如何评估位于这些位置的候选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接