尝试在 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;