插件程序给出一个类型转换错误



我创建了一个控制台应用程序,其中搜索以PlugIn.dll结尾的插件。它加载dll程序集并执行PlugIn.dll中plugclass的write方法。我创建了一个名为IWrite的接口,其中包括write方法。在执行控制台应用程序后,它给出如下错误:

无法强制转换HPlugIn类型的对象。

这是我的代码控制台应用程序。【主要用途】

using System;
using System.IO;
using System.Reflection;
namespace ConsolePlugIn
{
    interface IWrite
    {
        void write();
    }
    class Program
    {
        static void Main(string[] args)
        {
            foreach (string s in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*PlugIn.dll"))//getting plugins in base directory
            {
                Assembly aWrite = Assembly.LoadFrom(s);
                Type tWrite = aWrite.GetType("HPlugIn.plugInClass");
                IWrite click = (IWrite)Activator.CreateInstance(tWrite);//giving casting error
                click.write();
            }
        } 
    }
}

这是我的代码插件dll文件

using System;
namespace HPlugIn
{
    interface IWrite
    {
        void write();
    }
    public class plugInClass : IWrite
    {
      public  void write()
        {
            Console.Write("High from plugInClass");
        }
    }
}

对于这个类型转换错误有什么想法吗?提前感谢!

在EXE和DLL中的IWrite接口是不相同的,即使它们的结构是相同的。您需要使用该接口创建第三个dll,并在dll和EXE之间共享它。

共同

:

namespace Shared {
    interface IWrite {
        void write();
    }
}

DLL:

using System;
using Shared;
namespace HPlugIn {
    public class plugInClass : IWrite {
        public  void write() {
            Console.Write("High from plugInClass");
        }
    }
}

EXE:

using System;
using System.IO;
using System.Reflection;
using Shared;
namespace ConsolePlugIn {
    class Program {
        ...
    } 
}

您已经在2个不同的程序集中定义了两次IWrite接口。它们被认为是不同的类型,不能从一种类型转换为另一种类型。实现EXE和程序集之间较弱耦合的最佳方法是将此接口定义为单独的DLL。然后让插件和可执行文件都引用包含契约的第三个程序集(IWrite接口)。

有两个不同的IWrite接口。一个在控制台应用程序中,一个在dll中。有两种方法可以解决这个问题。

  • 使dll引用控制台应用程序,并让plugInClass实现ConsolePlugIn.IWrite接口。
  • 使用dynamic关键字使接口看起来相同匹配

相关内容

最新更新