我有以下方法应该检索加载的本地(在bin文件夹)程序集的列表:
static IEnumerable<Assembly> GetLocalAssemblies()
{
Assembly callingAssembly = Assembly.GetCallingAssembly();
string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath;
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
但是,程序集列表缺少我需要它的几个程序集.我需要的程序集是管理的(c#.net 4),在项目中引用,并存在于bin文件夹中.
为什么bin文件夹中存在的二进制文件在应用程序启动时不会进入AppDomain?
我们有一个使用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;
}
Run Code Online (Sandbox Code Playgroud)
如果我们对程序集中包含的对象进行虚拟引用,那么它会加载程序集,并且类型是由autofac构建的,如果我们删除虚拟对象,则不再包含程序集.
有没有办法包括所有引用的程序集,无论你是否直接在那里使用一个对象(记住我们仍然需要它,因为接口实现在那里).
这适用于ASP.NET,因为它只加载bin中的所有DLL.