公司的产品开发使用的是DevExpress的WinForms Collection控件集。当时使用的是2.x版本。现在看到3.x超强的功能,实在是馋人。所以希望能够从2.x升级到3.x。
但是,公司比较担心升级后会带来版本不兼容的问题,比如,在2.x发布的接口或属性在里3.0里发生了改动。于是我作了如下尝试,据我现在所知道的数据,我觉得从2.x升级到3.x是没有问题的。
为了方便,先定义一些变量:
DevExpress2.x版本的TextEdit控件:
TextEdit1
TextEdit2
DevExpress3.x版本的TextEdit控件:
TextEdit3
TextEdit4
首先,我想知道,DevExpress 2.x和3.x是否能够同时使用。于是,我在Form1中放置了TextEdit1和TextEdit3,然后,编译、运行。结果成功。但是出现了一个奇怪的问题,那就是:如果在Form1中先拖入TextEdit1(在项目的引用中添加DevExpress.XtraEditor),那么之后拖入的3.x的TextEdit控件都会被认为是2.x版本的TextEdit控件;反过来,如果先拖入TextEdit3(在项目的引用中添加DevExpress.XtraEditor3),那么之后拖入的2.x版本的TextEdit控件都会被认为是3.x版本的TextEdit控件。
我开始怀疑是VS2003将两个版本的dll给弄混了,因此我又作了如下:
1、我想模仿控件升级的场景,新建Form2,添加2.x版本的TextEdit控件TextEdit1(项目的引用中同时加入了DevExpress.XtraEditor)。
2、然后,添加3.x版本的TextEdit控件TextEdit3(项目的引用中添加了DevExpress.XtraEditor3)。这时,TextEdit3仍然被作为2.x的TextEdit控件被处理。
3、编译运行,没有问题。
4、将项目引用中对2.x版本DevExpress.XtraEditor和DevExpress.Utils项删除,只保留DevExpress.XtraEditor3、DevExpress.Data3和DevExpress.Util3项。
5、再添加3.x版本的TextEdit控件TextEdit4,我惊奇的发现,此时添加的TextEdit4居然被正确的识别为3.x版本的控件。可是,刚才添加的TextEdit3却仍然被识别为2.x版本的控件。
6、编译运行,没有问题,TextEdit1和TextEdit3都被编译为2.x的控件,而TextEdit4为3.x的控件。注意,这时,项目的引用中已经不再有对2.x版本dll的引用了,可是2.x版本的TextEdit控件编译运行仍然没有问题,而且行为还是2.x版本的行为。这不正是我们所希望的吗?低版本的控件还是低版本的控件,高版本的控件还是高版本的控件,互不影响。
我觉得其中的规则是:控件按照它拖入时的版本进行编译,高版本控件向下兼容低版本的控件。为了证明这个观点,我将上面的做法反过来,先添加3.x版本的TextEdit3,再添加2.x版本的TextEdit1,删除对3.x版本dll的引用,再添加2.x版本的TextEdit2,运行编译。结果,编译失败,报没有mask属性;这是由于删除了对3.x版本dll的引用,但是在视图设计界面TextEdit3仍然为3.x版本的控件,而TextEdit1和TextEdit2为2.x版本的控件。看来高版本向下兼容低版本。
我后来有将内部的一个项目用DevExpress提供的XtraConverter工具进行了一下转换,速度非常快,不像是修改代码的样子。打开项目的引用,发现有的使用DevExpress控件的项目原先对DevExpress.Editor dll的引用被修改为DevExpress.Editor3,不过,奇怪的是有的使用了DevExpress的控件,却没有修改引用。但是编译成功。虽然运行时失败,不过不是因为DevExpress控件升级。
好了,综上,我觉得DevExpress WinForms控件集完全能够很好的从低版本升级到高版本,而不必修改原来的程序。当然,这样下结论比较毛躁,希望各位网友提供线索。