2010-08-11 69 views
0

我正在尝试创建一个这样的插件体系结构;
IPlugin:所有插件必须实现的接口。
NormalPlugin:一个普通的插件。
ComplexPlugin:一个插件,除了实现基本方法外,还有一些自定义方法。
HostApp:知道IPlugin是什么的应用程序。在c中的定义/实现问题#

当前宿主应用程序在编译时将具有ComplexPlugin,并且会动态加载NormalPlugin。这是因为主机需要在ComplexPlugin中定义所以可以调用它的自定义方法。
1)有没有更好的方法来实现这个目标?因为在编译时添加一些插件作为参考主机应用程序看起来有点跛脚。

2)我试着使用:

public interface IPlugin 
{ 
    object CallCustomMethod(string methodName, object[] parameters); 
} 
但尽管如此,如果CallCustomMethod返回一个复合型,应用程序将需要知道复杂类型强制转换为。 在此先感谢

+1

http://stackoverflow.com/questions/3329399/best-practices-for-implementing-an-addin-addon-plugin-strategy – zerkms 2010-08-11 22:29:09

回答

0

如果应用程序从未通过CallCustomMethod函数调用ComplexPlugIn的自定义方法,那么在我看来,您应该永远不需要投射到ComplexPlugIn。 IPlugIn foo =(IPlugIn)myComplexObject.CallCustomMethod(“GenerateNewComplexPlugIn”,new object [] {0});
foo.CallCustomMethod(“AnotherComplexMethod”,null);

+0

感谢您的答案。 我的问题是关于了解CallCustomMethod的返回类型。它可能会返回ComplexPlugin中定义的ComplexData类/结构。我试图在宿主应用程序中编写相同类型的ComplexData。但是当我尝试将其转换为编译器时说:“无法将ComplexData类型转换为ComplexData”:) – Slantroph 2010-08-12 00:14:17

+0

可以通过在独立类库中定义ComplexData并在HostApp和ComplexPlugIn中包含对此库的引用来解决此特定问题。从插件与主机应用程序分离的角度来看,这似乎是有意义的,这似乎是使用插件的全部目的。 不知道“大图”很难说总体方法是好还是坏...... – Andrew 2010-08-12 01:40:22

+0

谢谢安德鲁。您的建议看起来像是解决问题的最佳解决方案。 – Slantroph 2010-08-12 02:10:36