插件程序给出一个类型转换错误
本文关键字:一个 类型转换 错误 程序 插件 | 更新日期: 2023-09-27 18:19:07
我创建了一个控制台应用程序,其中搜索以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
关键字使接口看起来相同匹配