尝试在 C# 中加载插件时无法加载 assemly 错误
could not load assemly error when try to load plugins in c#
我想创建一个插件架构,所以我创建了以下接口
public interface IPlug
{
string Id { get; }
string Name { get; }
byte IsOn { get; }
bool Execute();
}
现在我将上述接口引用到另一个 class 库项目。
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
}
}
}
上面的class 库被复制到主程序集文件中并存储在文件夹"Plugins" 中。然后我尝试用下面的代码加载插件。
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 '。”
我做错了什么?
您需要在 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;
我想创建一个插件架构,所以我创建了以下接口
public interface IPlug
{
string Id { get; }
string Name { get; }
byte IsOn { get; }
bool Execute();
}
现在我将上述接口引用到另一个 class 库项目。
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
}
}
}
上面的class 库被复制到主程序集文件中并存储在文件夹"Plugins" 中。然后我尝试用下面的代码加载插件。
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 '。”
我做错了什么?
您需要在 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;