用于插入组件的应用程序框架 - 第 I 部分






1.86/5 (6投票s)
2005年4月22日
2分钟阅读

24912

630
使用反射和接口进行后期绑定程序集的简单框架。
引言
在开发可插拔不同组件的框架时(尤其是在后期阶段),接口在框架和组件之间架起了桥梁。本文解释了如何使用在其他程序集中实现的接口作为其调用框架的后期绑定组件。此外,这也说明了接口的基本特性。
特别感谢**Marc Clifton**,《代理委托》的作者,并推荐大家阅读他的文章,以便更好地理解如何使用代理DLL。
工作原理……
如上图所示,Proxy是一个DLL,它声明了公共接口。应用程序和组件都引用了这个Proxy DLL,因此都了解该接口。每个组件都实现了公共接口的自己的版本。除了接口实现之外,还需要一种方法来实例化组件内实现该接口的类。为此,组件内部有一个单独的类。通过使用.NET反射调用此第二个类中的函数,应用程序获得对接口的引用,该引用可用于操作对象实例。
实现
演示项目在两个整数上使用接口实现了简单的数学运算。功能很简单,但它仍然清楚地解释了接口的用法。
IMath
是一个只有一个函数CalcValues
的接口,它在MathProxy.dll中声明。
namespace MathProxy
{
public interface IMath
{
int CalcValues(int i1, int i2);
}
}
使用IMath
接口,PluginAdd
实现Add
类。
public class Add : IMath
{
int IMath.CalcValues(int iValue1,int iValue2)
{
int iResult;
iResult = iValue1 + iValue2;
return iResult;
}
}
现在,应该有一种方法来创建Add
类的实例。下面位于PluginAdd
中的代码片段声明了一个满足此要求的类。(此时,需要添加对MathProxy.dll的引用)。
public class CreateIntf
{
static Add m_add;
static public IMath Create()
{
m_add = new Add();
return m_add;
}
}
现在,让我们看看如何在应用程序中使用这些模块。下面两行代码展示了如何在定位程序集和要调用的函数中使用.NET反射。(这里的m_Math
是IMath
类型,而不是Add
类型)。GetMethodInfo
函数什么也不做,只是使用传入的string
填充MethodInfo
类。真正的的方法调用发生在第二行,它返回对IMath
接口实现的引用(即PluginAdd.dll中的Add
类)。
MethodInfo mi=GetMethodInfo("PluginAdd.dll/PluginAdd.CreateIntf/Create");
m_Math = (IMath)mi.Invoke(null, BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.InvokeMethod |
BindingFlags.Static, null, null, null);
最后,PluginAdd
中有一个对Add
对象的引用,我们只需根据需要调用接口中的函数即可。如下所示,使用m_Math
调用函数CalcValues
,结果显示在消息框中。
iRet = m_Math.CalcValues(10,20);
MessageBox.Show( iRet.ToString() );
注释
尽管我已经描述了PluginAdd程序集的实现和用法,但演示源代码还包含PluginSub程序集,它使用IMath
接口说明了减法运算。
可插拔组件的应用程序框架 - 第二部分 将很快推出,解释如何在事件发生时通知框架。