一种强制装配负载进入当前域的正确方法

时间:2011-12-15 21:20:24

标签: c# .net

我有一个项目,它使用属于我项目的几个类库,首先加载AssemblyA,然后加载AssemblyB。在AssemblyA中,有代码执行以下操作

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var assemblyB = assemblies
                .Where(x=>x.GetName() == "AssemblyB")
                .First();
var type = assemblyB.GetType("AssemblyB_Type");

不幸的是,当AssemblyA尝试这样做时,AssemblyB尚未加载到CurrentDomain中,所以要加载该程序集我正在做以下不必要的事情:

var x = typeof(AssemblyB.AssemblyB_Type);

编译器显示警告说这条线是不需要的,虽然我找不到单词来解释它,否则它将无法工作,所以问题是,你怎么正确(用风水术语)强制组装加载到CurrentDomain而不进行额外无用的管道

4 个答案:

答案 0 :(得分:8)

您现有的代码是最好的方法(AFAIK)。

要删除警告,请将其更改为

typeof(AssemblyB.AssemblyB_Type).ToString();

答案 1 :(得分:3)

如果您正确部署了引用的程序集,那么如果您调用其中一种类型,它们应该“加载”。 .NET框架应该为您解决这个问题。

这是一篇很好的文章,解释了框架搜索引用程序集的方式:http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

我很好奇你正在做什么,你需要像这样过早地加载一个组件?

回答直接问题的黑客是使用Assembly.Load(字符串位置) - 尽管除非绝对必要,否则我会劝阻它。 http://msdn.microsoft.com/en-us/library/ky3942xh.aspx

答案 2 :(得分:1)

因此,您可以将bin目录中的所有程序集加载到app域中。这应该可以解决你的问题。

var assemblies = Directory.GetFiles(containingDirectory, "*.dll")'

foreach (var assembly in assemblies)
{
    Assembly.Load(AssemblyName.GetAssemblyName(assembly));
}

答案 3 :(得分:1)

这就是我的所作所为:

public static class TypeExtensions {
   public static void EnsureAssemblyLoads(this Type pType) {
      // do nothing
   }
}

...

typeof(SomeType).EnsureAssemblyLoads();