我创建了一个控制台应用程序,搜索以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");
}
}
}
这个投射错误的任何想法? 提前谢谢!
答案 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中。有两种方法可以解决这个问题。
plugInClass
实现ConsolePlugIn.IWrite
界面。dynamic
关键字使接口看起来相同。