即使未在代码中明确使用,也要加载所有引用的程序集.NET

时间:2013-04-03 13:39:07

标签: assemblies autofac

我们有一个使用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。

1 个答案:

答案 0 :(得分:1)

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