如何在具有多个项目的解决方案中预加载每个程序集

时间:2014-01-13 22:57:47

标签: c# .net

我有一个包含4个项目的解决方案,这些项目以这种方式相互引用:

  • Project RoleCreator引用Project Unify.ServiceInterface和Unify.ServiceModel

我想通过Project RoleCreator中的某个方法预先加载解决方案中所有项目的程序集,但是在这一行中Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 在断点值中,只显示来自projectUnify.ServiceInterface的程序集,而不是项目Unify.ServiceModel中的程序集,它也在项目RoleCreator中引用。我希望从解决方案中加载所有程序集!

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用此类代码:

public static void PreloadAssembly(Assembly assembly)
{
    var references = assembly.GetReferencedAssemblies();
    foreach (var assemblyName in references)
    {
        Assembly.Load(assemblyName);
    }
}

然后

PreloadAssembly(typeof(TypeFromAssembly1).Assembly);
PreloadAssembly(typeof(TypeFromAssembly2).Assembly);

此次电话

AppDomain.CurrentDomain.GetAssemblies()

将返回已加载程序集的列表。如果您没有从某个程序集访问类型,那么AppDomain将不会加载它,并且它将不会出现在GetAssemblies调用中。 AppDomain为您使用的类型加载程序集。

另外一种方法是在这里描述 - how to load all assemblies from within your /bin directory。它只是从bin文件夹加载所有程序集

答案 1 :(得分:0)

如果是网络应用程序,您可以使用BuildManager.GetReferencedAssemblies。以下是来自Autofac wiki的示例(虽然它来自Autofac并不相关):

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
  

这将强制将引用的程序集立即加载到AppDomain中,使其可用于模块扫描。