【问题标题】:could not load assemly error when try to load plugins in c#尝试在 C# 中加载插件时无法加载汇编错误
【发布时间】:2017-03-04 14:33:08
【问题描述】:

我想创建一个Plugin架构所以我创建了如下界面

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;

文件是从Directory.GetFiles方法得到的dll文件。 当我尝试创建实例时,它会抛出错误“无法从程序集 'PlugA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 加载类型 'IPlug'。”

我做错了什么?

【问题讨论】:

    标签: c# plugins assemblies


    【解决方案1】:

    您需要在 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;
    

    【讨论】:

    • " 异常已被调用的目标抛出" 如果我​​从插件接口实现具有不同命名空间的 PlugB 、PlugC ,它也不会是动态的
    • @AjitHegde 这意味着你的插件类的构造函数抛出了异常。如果要动态加载插件,则需要按照 Michal Hainc 的建议使用反射检查程序集。
    • 我清除了构造函数中的代码,它完全是空的。获取“给定的程序集名称或代码库无效。(来自 HRESULT 的异常:0x80131047)”在 assembly.Load(文件)错误。但是,如果我使用 AssemblyName.GetAssemblyName 方法,它会给出正确的名称
    • 如果我使用 Assembly.LoadFrom(file)。我会将插件类型设为空。我不明白为什么它不加载界面。
    • AssemblyName an = AssemblyName.GetAssemblyName(file);程序集程序集=Assembly.Load(an)。工作。
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2017-10-05
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多