2016-10-22 53 views
0

加载插件,我想创建一个插件架构,所以我创建了以下接口无法加载assemly错误时尝试在C#

public interface IPlug 
{ 
    string Id { get; } 

    string Name { get; } 

    byte IsOn { get; } 

    bool Execute(); 
} 

现在我参考上面的界面到另一个类库项目。

namespace PlugANameSpace 
{ 
    public class PlugA : IPlug 
    { 
     private byte _isOn; 

     public string Id 
     { 
      get {return "6666"; } 
     } 

     public byte IsOn 
     { 
      get { return _isOn; } 
     } 

     public string Name 
     { 
      get { return "PlugA"; } 
     } 

     public PlugA() 
     { 

      LoadFromRegistry(); 
     } 

     public bool Execute() 
     { 
      // do some thing that returns true for success or false for error 
     } 

     private void LoadFromRegistry() 
     { 
       //register in registry 
     } 
    } 
} 

上面类库被复制到主组件文件和存储在文件夹“插件”英寸然后我试着用下面的代码加载插件。

IPlug plug= Activator.CreateInstanceFrom(file, typeof(IPlug).FullName) as IPlug; 

file是从Directory.GetFiles得到的dll文件的方法。 当我尝试创建实例时,它会从程序集“PlugA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'中抛出错误”无法加载类型'IPlug'。“

我做错了什么。 ?

回答

0

您需要在PlugA程序集中指定类型的名称。

IPlug plug = Activator.CreateInstanceFrom(file, "PlugANameSpace.PlugA") as IPlug; 

编辑:如果要加载插件不知道类型的名称:

var assemblyName = AssemblyName.GetAssemblyName(file); 
var assembly = Assembly.Load(assemblyName); 
var pluginType = assembly.GetTypes().FirstOrDefault(t => typeof(IPlug).IsAssignableFrom(t)); 
IPlug plug = Activator.CreateInstance(pluginType) as IPlug; 
+0

“异常已通过调用的目标引发异常”,也不会是动态如果我实现了PlugB,PlugC和来自I插件接口的不同命名空间 –

+0

您需要的逻辑遍历配置位置中的所有dll文件,通过Assembly.Load加载它们,然后在那些加载的Assembly对象中找到从IPlug继承的类型 –

+0

@AjitHegde它表示你的插件类的构造函数抛出一个ex ception。如果您想要动态加载插件,您需要使用Michal Hainc建议的反射来检查程序集。 – airafr

相关问题