2011-02-05 97 views

回答

1

是的。

您可以根据通用接口或标记属性动态加载程序集。

Dynamic assembly loading

您可能需要调查复合应用程序块(CAB)(但它确实有一个学习曲线)

0

MS在C#的Shareware Starter Kit中有一个示例和工具。从这里下载: http://msdn.microsoft.com/en-us/library/cc533530.aspx

这有点旧了。但是,如果您正在寻找免费资源(有一些商业解决方案),这就是所有这些都不需要从头开始整个基础架构的存在。

0

如果您不想使用MEF,请尝试此操作。所有的 首先定义(在库)的接口:

namespace Plugin01 
{ 
    public class Class1 : Interfaces.IPlugin01,Interfaces.IPlugin02 
    { 
     public string Name { get { return "Plugin01.Class1"; } } 
     public string Description { get { return "Plugin01.Class1 description"; } } 
     public void Calc1() { Console.WriteLine("sono Plugin01.Class1 Calc1()"); } 
     public void Calc2() { Console.WriteLine("sono Plugin01.Class1 Calc2()"); } 
    } 

    public class Class2 : Interfaces.IPlugin01 
    { 
     public string Name { get { return "Plugin01.Class2"; } } 
     public string Description { get { return "Plugin01.Class2 description"; } } 
     public void Calc1() { Console.WriteLine("sono Plugin01.Class2 Calc1()"); } 
    } 
} 

最后:

namespace Interfaces 
{ 
    public interface IPlugin01 
    { 
     string Name { get; } 
     string Description { get; } 
     void Calc1(); 
    } 

    public interface IPlugin02 
    { 
     void Calc2(); 
    } 
} 

然后使用类实现的接口(一个或多个)写你的插件(可能是DLL文件组件)创建您的应用程序,加载并使用你的插件:

namespace Test 
{ 
    class Program 
    { 
     /// ------------------------------------------------------------------------------    
     /// IMPORTANT: 
     /// you MUST exclude Interfaces.dll from being copied in Plugins directory, 
     /// otherwise plugins will use that and they're not recognized as using 
     /// the same IPlugin interface used in main code. 
     /// ------------------------------------------------------------------------------    
     static void Main(string[] args) 
     { 
      List<Interfaces.IPlugin01> list1 = new List<Interfaces.IPlugin01>(); 
      List<Interfaces.IPlugin01> list2 = new List<Interfaces.IPlugin01>(); 

      List<Interfaces.IPlugin01> listtot = GetDirectoryPlugins<Interfaces.IPlugin01>(@".\Plugins\"); 

      Console.WriteLine("--- 001 ---"); 
      foreach(Interfaces.IPlugin01 plugin in list1) 
       plugin.Calc1(); 

      Console.WriteLine("--- 002 ---"); 
      foreach (Interfaces.IPlugin01 plugin in list2) 
       plugin.Calc1(); 

      Console.WriteLine("--- TOT ---"); 
      foreach (Interfaces.IPlugin01 plugin in listtot) 
       plugin.Calc1(); 
      Console.ReadLine(); 
     } 

     public static List<T> GetFilePlugins<T>(string filename) 
     { 
      List<T> ret = new List<T>(); 
      if (File.Exists(filename)) 
      { 
       Assembly ass = Assembly.LoadFrom(filename); 
       foreach (Type type in ass.GetTypes()) 
       { 
        if (!type.IsClass || type.IsNotPublic) continue; 
        if (typeof(T).IsAssignableFrom(type)) 
        { 
         T plugin = (T)Activator.CreateInstance(type); 
         ret.Add(plugin); 
        } 
       } 
      } 
      return ret; 
     } 
     public static List<T> GetDirectoryPlugins<T>(string dirname) 
     { 
      /// To avoid that plugins use Interfaces.dll in their directory, 
      /// I delete the file before searching for plugins. 
      /// Not elegant perhaps, but functional. 
      string idll = Path.Combine(dirname, "Interfaces.dll"); 
      if (File.Exists(idll)) File.Delete(idll); 

      List<T> ret = new List<T>(); 
      string[] dlls = Directory.GetFiles(dirname, "*.dll"); 
      foreach (string dll in dlls) 
      { 
       List<T> dll_plugins = GetFilePlugins<T>(Path.GetFullPath(dll)); 
       ret.AddRange(dll_plugins); 
      } 
      return ret; 
     } 
    } 

只是一个评论:我的解决方案(含接口,插件和测试控制台应用程序)编译我的应用我n 。\ bin和插件。\ bin \ Plugins。在这两个文件夹中部署了我的项目所依赖的Interfaces.dll这是一个严重的问题,请记住(阅读代码中的注释)! 因此,您可以编译您的插件,避免该问题Interfaces.dll被复制到。\ bin \ Plugins dir;但是如果你忘记了这一点,你的应用根本无法工作;所以我决定在搜索和加载插件之前强制删除dll。

+0

这是意大利语,但是Gian Maria Ricci(微软MVP)写了一篇很好的文章。 这里是链接[链接] http://dotnetmarche.org/blogs/article/archive/2006/10/30/Creare-un-programma-estendibile-mediante-plugin-_2D00_-Parte-1.aspx [/ link ] and [link] http://dotnetmarche.org/blogs/article/archive/2007/01/29/Creare-un-programma-estensibile-tramite-plugins-_2D00_-Parte-2.aspx [/ link] – Marco 2011-03-17 11:24:28

相关问题