问题 - 我正在尝试使用plugIn开发,除非尝试将对象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
答案 0 :(得分:2)
您引用DynamicApplications.IPlugIn
并且该程序集中包含的界面不同。
您需要从程序集中获取IPlugin
实例,而不是使用本地实例。如果您执行了类似的操作,那么您的检查代码就可以了:
public interface IA { }
public class A :IA { }
object a = Activator.CreateInstance<A>();
if (a is IA)
Console.WriteLine("Yes");
但是,您从其他地方获取了A
(在上述情况下),并且仍在尝试引用您的本地版IA
- 因此您需要从程序集中获取接口而不是试图在本地引用它。也许你可以这样做:
if (objA.GetType().GetInterfaces().Any(x => x.Name == "IA"))
Console.WriteLine("Yes");