【问题标题】:Referenced Assembly Not Found - How to get all DLLs included in solution未找到引用的程序集 - 如何获取解决方案中包含的所有 DLL
【发布时间】:2012-04-03 16:29:02
【问题描述】:

我正在运行一个 WCF 应用程序 CoreApplication,其 VS 项目引用了 AncillaryProjectCoreApplication 使用来自AncillaryProject 的类Provider;但是,它从未被显式引用 - 它是通过反射调用的。

我的问题是 有时 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;

查看this question后,我尝试使用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 根本不加载其他程序集? 这在后台是如何工作的,我能做些什么吗?

【问题讨论】:

  • 它不会完全回答你的问题,但在我对这个问题的回答中有一些相关信息:stackoverflow.com/questions/9947882/… 除了注意到 VisualStudio 中的“引用”程序集在运行时没有多大意义,下面关于使用 Fusion Logger 的答案也是一个很好的帮助。您应该能够将 AncillaryProject.dll 复制到 Fusion 正在寻找程序集的任何地方,但它可能会提供一些关于它在哪里寻找的答案。
  • 啊——这正是我需要知道的信息。
  • 任何发现这个问题的人的后续行动:在问这个问题之后的几年里,我意识到我正在以完全错误的方式解决这个问题。有时不那么神奇并明确列出您想要的Types 会好得多。这是其中一种情况。

标签: c# .net reflection assemblies


【解决方案1】:

根据 Microsoft 文档AppDomain.CurrentDomain.GetAssemblies() 获取已加载到此应用程序域的执行上下文中的程序集。 About AppDomain.CurrentDomain.GetAssemblies()

您似乎需要将加载所需程序集的策略从使用 appdomain 更改为在应用程序文件夹中查找 dll。

我发现一个关于类似问题的讨论here

【讨论】:

  • 是的,这完美地描述了它。谢谢。
【解决方案2】:

您可以处理 AssemblyResolve 事件并在该事件处理程序中加载 AncillaryProject.dll

http://msdn.microsoft.com/en-us/library/ff527268.aspx

【讨论】:

    【解决方案3】:

    您应该下载 .NET 开发 SDK 并启动 FuslogVw.exe(融合日志查看器)。它将报告试图解决 .NET 依赖关系的 CLR 应用程序。它会告诉你它正在寻找什么以及它如何评估位于这些地方的候选人。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多