【发布时间】:2012-12-11 13:41:37
【问题描述】:
问题 - 我正在尝试插件开发,除了尝试将对象 A 转换为对象 B 之外,尽管 A 实现了 B,但一切进展顺利。
界面:
namespace DynamicApplications
{
public interface IPlugIn
{
string Name { get; set; }
IPlugInHost myHost { set; }
void Show();
}
public interface IPlugInHost
{
bool Register(IPlugIn plug);
}
}
实现IPlugIn的类
namespace plugInOne
{
class PlugIn : IPlugIn
{
IPlugInHost _myHost;
public string Name
{
get
{
return "Plug-In One";
}
set
{
}
}
public IPlugInHost myHost
{
set
{
_myHost = value;
}
}
public void Show()
{
}
}
}
现在是实例化的代码:
String path = Application.StartupPath;
string[] assemblyNames = Directory.GetFiles(path, "*.dll");
plugs = new IPlugIn[assemblyNames.Length];
for(int i = 0; i < assemblyNames.Length; i++)
{
string Name = assemblyNames[i];
Name = Name.Substring(Name.LastIndexOf("\\") + 1, Name.Length - Name.LastIndexOf("\\") - 1);
Name = Name.Remove(Name.LastIndexOf(".dll"));
assemblyNames[i] = Name;
}
for (int i = 0; i < assemblyNames.Length; i++)
{
Assembly DLL = Assembly.Load(assemblyNames[i]);
if(DLL != null)
{
try
{
Object p = Activator.CreateInstance(DLL.GetType(assemblyNames[i] + ".PlugIn"));
if (p is DynamicApplications.IPlugIn)
{
MessageBox.Show("YES!!!!");
}
else
{
MessageBox.Show("no>?>?>>><<?????");
}
plugs[i] = (IPlugIn)p;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
请注意,调试器显示p 实际上已实例化并可访问
应用程序总是点击MessageBox.Show("no>?>?>>><<?????");
请帮忙
艾登
编辑
P 的类型:
还有
YET pluginOne.PlugIn 实现了 IPlugIn
【问题讨论】:
-
让您的消息框显示
p的类型。一旦你知道了,你可能就不需要更多的帮助了。 -
您似乎引用了不同的程序集。常见错误。
-
我(1)将接口和实例化代码放在控制台应用程序中,(2)从类库中引用控制台应用程序并将实现放入库中,(3)构建库并将控制台应用程序文件夹中的 DLL,(4) 运行控制台应用程序和
MessageBox.Show("YES!!!!");的控制台等效项 did 触发。在原则中,你什么都不做;在practice中,可能您的 DLL 不存在,或者已经过时,或者其他什么。
标签: c# plugins dll interface polymorphism