当前已经开发完成了一个主程序框架,但是有些新功能要加进去。那么在不修改主程序的情况下,用什么方法能实现快速、方便的将新功能实现呢?
上网查了一下,发现C#单机程序开发时,插件基本都是采用反射机制进行开发的。(请教大牛,还有没有其他方式,做插件开发的,望不吝赐教啊!)
网上也有很多反射的例子,但是我也有些特殊需求。
因为我从事的是工程计算相关的工作,除了一些商业软件,如ANSTS,FLUENT等来进行工程力学计算外,很多客户有自己的一些算法,比如,有计算导弹弹道的,有计算水轮机冷却的,有计算核电设备应力修正的,等等。
这些算法有一个通用的方式,就是定义一些参数,然后调用各种力学公式,算出一些结果参数。客户根据这些结果参数来判断设计是否合理。
那么客户的计算流程就是,根据不同工况,设置不同的参数值,然后调用函数,进行计算,得出结果。
那么,这些输入参数在不同工况下,采用不同值怎么办呢?仅仅凭借反射,貌似只能获取信息,不能往里面传递信息吧?(请教大牛,是不是这样的?)
我需要有个东西,能够向dll中的参数传递信息。这时候,我想到了codeDOM。每次调用dll时候,能根据dll的信息,自动创建一个类,使用一个函数向dll实例中传递参数。
这样,又有问题了:
1.我的具有新功能的dll到底应该怎么写,才能被我的主程序认识并调用呢?dll中的参数我怎么能设置默认值,并能够取出来呢?
2.这个动态类的函数怎么写呢?怎么能够将dll的实例传进去,并能够点出其中包含的对象呢?怎么才能够支持各种各样的数据类型呢?
唉,都需要去测试啊!
现在,终于有了初步答案。
1.这个dll必须要有一些约定,比如定义一些接口,实现求解计算的功能。定义一些属性,用来标记哪些参数是可以被反射的输入参数,哪些参数是可以被反射的输出参数;还用来标记每个参数的默认值,每个参数的说明等。
2.动态类使用固定namespace,classname,固定的函数名称等,让我的主程序能够写死调用。通过上一步反射得到各个输入参数,然后在动态类的函数中对这些变量进行赋值。
好了,下面可以进行编码测试了!