插件应用程序给出了一个转换错误

时间:2012-01-01 14:48:27

标签: c# .net reflection plugins console-application

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

无法将“HPlugIn.plugInClass”类型的对象转换为“ConsolePlugIn.IWrite”。

以下是我的控制台应用程序代码.. [主要应用程序]

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();
            }
        } 
    }
}

这是我的plugIn dll文件的代码

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

这个投射错误的任何想法? 提前谢谢!

3 个答案:

答案 0 :(得分:1)

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 {
        ...
    } 
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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