尝试在c#中加载插件时无法加载assemly错误

时间:2016-10-22 10:13:01

标签: c# plugins assemblies

我想创建一个插件架构,所以我创建了以下界面

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'。 "

我做错了什么。?

1 个答案:

答案 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;