我想做这样的事情:
这样做的最佳方式是什么? 我目前正在使用Framework 3.5。
(ps我知道我可以定义一个包含程序集名称的变量(例如key =“My assembly”,value =“myassembly.dll”然后动态加载程序集,只是想知道是否有更正确的这样做的方式)
答案 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();
适合我!