代码之家  ›  专栏  ›  技术社区  ›  Will I Am

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

  •  0
  • Will I Am  · 技术社区  · 16 年前

    我想做这样的事情:

    1. 在我的应用程序的web.config或app.config中,定义要加载其中的哪一个(它们可能有不同的名称)

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   Mehrdad Afshari    16 年前

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

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

    var typeName = "MyNamespace.MyClass, MyAssembly"; // load from config file
    IMyInterface instance = 
                  (IMyInterface)Activator.CreateInstance(Type.GetType(typeName));
    
        2
  •  0
  •   Carlos Eduardo Appel Klein Carlos Eduardo Appel Klein    16 年前

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

    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;
    

    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();