我有一个项目,它使用属于我项目的几个类库,首先加载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而不进行额外无用的管道
答案 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();