加载实现接口的程序集的正确方法?

时间:2009-07-20 16:42:14

标签: c# .net

我想做这样的事情:

  1. 创建许多实现IMyInterface的程序集。
  2. 在我的应用程序的web.config或app.config中,定义要加载哪一个(它们可能有不同的名称)
  3. 当应用程序启动时,按照web.config中的标记加载程序集并使用其IMyInterface的实现
  4. 这样做的最佳方式是什么? 我目前正在使用Framework 3.5。

    (ps我知道我可以定义一个包含程序集名称的变量(例如key =“My assembly”,value =“myassembly.dll”然后动态加载程序集,只是想知道是否有更正确的这样做的方式)

2 个答案:

答案 0 :(得分:3)

程序集不实现接口;类型做。

对于ASP.NET应用程序,我建议将每个程序集放在/bin目录中,并使用web.config配置选项和Activator.CreateInstance来创建实际类型:

var typeName = "MyNamespace.MyClass, MyAssembly"; // load from config file
IMyInterface instance = 
              (IMyInterface)Activator.CreateInstance(Type.GetType(typeName));

答案 1 :(得分:0)

我这样做如下(我使用基类,用抽象方法代替接口):

1 - 列出用我的基类实现的类。

Assembly assembly = null;
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = "FullPathToAssembly";

assembly = Assembly.Load(assemblyName);


Type[] arrayTipo;
arrayTipo = assembly.GetTypes();

var tipos =
from t in arrayTipo
where t.BaseType == typeof(DD.Util.BaseProcesso)
select t;

2 - 在类的实例中调用执行方法:

Type tipo = engine.GetType("FullClassName");
BaseProcesso baseProcesso = (BaseProcesso)Activaor.CreateInstance(tipo, new object[] { "ConstructorParameter1", "ConstructorParameter1") });
// Event
baseProcesso.IndicarProgresso += new  BaseProcesso.IndicarProgressoHandler(baseProcesso_IndicarProgresso);
new Thread(new ThreadStart(baseProcesso.Executar)).Start();

适合我!