8

我的应用程序加载位于其执行路径中的所有库程序集,并针对包含的类执行预知方法。

我现在需要对引用我的应用程序程序集的程序集执行相同的操作。这可能吗?是否有任何我应该注意的负面影响?

主组装:

public abstract class TaskBase 
{ 
    public abstract void DoWork(); 
}  

LoadAssemblyFromFile("Assembly0001.dll");  
Assembly0001.Task1.DoWork();  

子组件:

public sealed class Task1: MasterAssembly.TaskBase  
{ 
    public override void DoWork { /* whatever */ } 
}
4

4 回答 4

6

是的,这是可能的。只要您的主程序集不引用子程序集,就可以了。否则,您将有一个循环依赖。

主程序集将简单地加载子程序集,并且对它们一无所知,除了它们实现了一个接口。这样,主程序集就不需要引用子程序集。

据我所知,没有任何问题。我们成功地将这种技术用于某些场景。

于 2012-04-15T20:30:32.980 回答
1

根据我的经验,这并没有错。实际上,MEFAssemblyCatalog以(您的实现在主程序集中)和DirectoryCatalog(接口的实现在特定目录中的程序集中) 的形式使用这种技术。

两者可以毫无问题地一起使用AggregateCatalog

于 2012-04-15T20:27:47.000 回答
0

唯一的“问题”是您不能在主程序集中编写 Assembly0001.Task1 但您可以在加载的程序集中找到正确的任务并调用该任务:

var asm = LoadAssemblyFromFile("Assembly0001.dll");
var taskType = asm.GetTypes().FirstOrDefault(t => typeof(TaskBase).IsAssignableFrom(t));
var task = (TaskBase)Activator.CreateInstance(taskType);
task.DoWork();

您仍然需要添加一些额外的安全检查:)

于 2012-04-15T20:35:46.210 回答
0

您没有发布 LoadAssemblyFromFile("...") 方法的代码,但如果它使用 Assembly.LoadFrom() 或 Assembly.LoadFile() 加载程序集,您可能会收到 InvalidCastException、MissingMethodException 或其他异常,尤其是在您的应用程序中和加载的程序集都引用了相同的其他程序集。LoadFrom() 和 LoadFile() 在与您的应用程序不同的绑定上下文中加载程序集。有关详细说明,请参阅此内容。

于 2012-04-15T22:10:23.050 回答