我想创建一个插件架构,所以我创建了以下界面
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
}
}
}
上面的类库被复制到主程序集文件中并存储在文件夹" Plugins"中。然后我尝试使用以下代码加载插件。
IPlug plug= Activator.CreateInstanceFrom(file, typeof(IPlug).FullName) as IPlug;
文件是从Directory.GetFiles
方法获取的dll文件。
当我尝试创建实例时,它会抛出错误"无法加载类型' IPlug'来自assembly' PlugA,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。 "
我做错了什么。?
答案 0 :(得分: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;