2016-10-22 56 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

相關問題