【问题标题】:Loading all referenced assemblies .NET even if not used explicitly in code加载所有引用的程序集 .NET,即使未在代码中显式使用
【发布时间】:2013-04-03 13:39:07
【问题描述】:

我们有一个使用 Autofac 的 Windows 服务,当我们尝试加载引用的程序集时,并非所有程序集都被列为某些包含我们没有在应用程序中的任何地方使用的对象,但是我们需要包含接口实现。以下方法加载程序集:

private IEnumerable<Assembly> GetReferencedAssemblies(Assembly assembly)
{
  var assemblyNames = assembly.GetReferencedAssemblies();

  List<Assembly> assemblies = new List<Assembly>();
  assemblies.Add(assembly);
  foreach (var item in assemblyNames)
  {
    var loadedAssembly = System.Reflection.Assembly.Load(item.FullName);
    assemblies.Add(loadedAssembly);
  }

  return assemblies;
}

如果我们对包含在程序集中的对象进行虚拟引用,则它会加载程序集并且类型由 autofac 构建,如果我们删除虚拟对象,则不再包含程序集。

有没有办法包含所有引用的程序集,无论您是否直接使用其中的对象(请记住,我们仍然需要它,因为接口实现在那里)。

这在 ASP.NET 上运行良好,因为它只是加载 bin 中的所有 DLL。

【问题讨论】:

  • 至少有几种方法可以解决这个问题。这听起来像是我会使用 MEF 的情况。在每个程序集中放置一个Autofac Module 并使用 MEF 获取所有模块,然后 Autofac 可以接管。

标签: assemblies autofac


【解决方案1】:

如果您实际上没有在程序集中引用某个类型,编译器将删除该引用,因为它被认为是多余的。您需要使用Assembly.Load() 手动将所需的程序集加载到AppDomain 中。如何确定要加载的程序集取决于您。您可以选择查看特定文件夹中的文件,也可以使用包含程序集名称的配置文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2019-11-01
    • 2015-02-08
    • 2010-10-05
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多