开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 10646|回复: 10

DevExpress 18 源代码编译方法

[复制链接]

0

精华

700

贡献

421

赞扬

帖子
31
软币
1735
在线时间
157 小时
注册时间
2017-2-20
发表于 2018-12-11 19:35:16 | 显示全部楼层 |阅读模式
编译使用的DevExpress版本是18.1.4,用SourceBuilderTool1.0.5编译一堆错误,只能自己动手编译了,下面记录下编译过程。

DevExpress的源码中有个目录BuildUWP,里面的说明文件明确说了,这只是个例子,并不是完整的编译脚本。
这其实是个大坑,无数人会掉进去。而且这里的编译脚本只编译了UWP,不包括其它控件。这其实看文件夹的名称就能看出来,但是第一次编译的人会把这个文件夹当作是DevExpress官方提供的编译脚本,认为一定是包括所有控件的,所以这就会出很大的问题。

从上一个问题就延伸出下一个问题了,这个脚本写的并不严谨,里面直接就写死了,就是找c盘下的vs2017的专业版和企业版,会让人以为编译源码无法使用vs2017社区版,实际上又是一个小坑,使用vs2017的哪个版本都行。

编译UWP应用的时候,有些项目会报错,主要就是以Design结尾的项目,会提示找不见Windows.winmd,这个问题就是DevExpress开发团队使用的windows应该是win8,里面才有这个项目,到了win10,已经拆分的更具体了。这就需要用vs打开项目文件,修改引用,再修改引用之前,需要先用文本编辑工具打开项目文件,增加一行。具体如何做可以参考这篇文章:https://software.intel.com/en-us/articles/using-winrt-apis-from-desktop-applications.修改完毕之后就可以进行编译了,编译成功会生成对应的dll。到这一步vs还是无法引用相关的控件。

下面说一下另一种比较方便的编译源代码的方法。
首先在源代码的同级目录下创建一个vs项目,然后将同一种类的项目代码添加进去,比如所有WinForms控件都可以加入到一个解决方案中,这样管理起来就比较方便了。
这里要注意的一个是强签名的问题,一个是项目之间的引用关系,可以先添加最基本的项目,编译成功后,继续添加项目,直到添加同一类型的项目完毕。
BuildUWP下面有个生成签名文件的脚本,生成后会在源代码文件夹DevExpress.Key文件夹下面生成StrongKey.snk,这是私钥文件,公钥文件生成在临时目录里了,这里我们用命令自己生成一下公钥文件。
生成公钥
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sn.exe" -p DevExpress.Key\StrongKey.snk DevExpress.Key\StrongKey.publickey
查看公钥
D:/YoudaoNote/x2487mp@163.com/4985be6b3e69498ba0916add70813ac2/f4075565ddd04a248f2f3945731e0522.jpg
1.jpg
这些内容是要替换AssemblyInfo中相关值的:
2.jpg
D:/YoudaoNote/x2487mp@163.com/ae267748a493402abc7c45754214bf49/b2153616a8624fca9523f718975dfe24.jpg
PublicKey就要替换,可以手动替换,也可以使用BuildUWP中的工具PatchInternalVisibleTo.exe
替换代码中的公钥
BuildUWP\PatchInternalVisibleTo.exe DevExpress.Data\AssemblyInfo.cs "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sn.exe" DevExpress.Key\StrongKey.snk

创建好解决方案后,第一个要添加的项目是,DevExpress.Data,里面有两个项目文件,都要添加,这个项目中有两个文件要修改对应的publickey,AssemblyInfo.cs和AssemblyVersion,后者里面的PublicKeyToken也修改成自己的公钥标记。
D:/YoudaoNote/x2487mp@163.com/7e07330291e34e3ea428cc7391f0f17f/b2153616a8624fca9523f718975dfe24.jpg

下面就可以开始一边编译一边添加项目了。
WinForms总共涉及到多少个项目呢,也不多,94个,第一次编译会有多少报错呢,也不是很多,也就5万多吧,哈哈

解决编译错误:
第一步,统一类库,所有项目选择相同的类库,这样错误能到4万左右。
第二步,修改所有项目中的AssemblyInfo.cs文件,更换publickey和publicktoken。在整个项目范围内搜索替换这两个值。(这涉及到友元的问题)。
第三步,DevExpress.Diagram.Core所引用的项目都编译成功,但是这个项目编译不成功,主要是因为DiagramLocalizerGenerator.tt中引用了LocalizerGenerator.tt,但是当前目录下没有这个文件,搜索整个项目,在DevExpress.Dialogs.Core中发现对应的文件,复制到DiagramLocalizerGenerator.tt目录下,修改下这个文件然后恢复,保存后自动生成类,项目编译成功。
第四步,其它类都正常了,就是DevExpress.Design还是无法编译通过,主要是引用系统框架里的一些dll显示异常,这主要是因为这些dll只在4.5及以上框架存在,4.0中没有。修改完毕后,所有控件使用的框架是.net 4.0的,所有设计时用到的控件都是.net 4.5的,这个要注意下。修改时,首先将项目框架改为4.5,然后删除显示不正常的引用,重新引用下就行了。
注意: DevExpress.XtraReports.Design (删除引用的水晶报表组件,可以编译成功)
第五步,项目整体编译一下,把编译出错的漏网之鱼再修改下,就ok了。
第六步,把编译好的dll加入到GAC中。
bin目录下是控件,bin/Design目录下是设计器。
将bin下的dll文件名生成到list.txt文件中,运行命令 dir *.dll /B > list.txt, 然后到design目录下运行同样的命令,之后以管理员权限运行cmd,分别cd到bin目录下和design目录下,运行一下命令:"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\gacutil.exe" /il list.txt
第七步,在工具箱中添加控件,控件较多,可以按分类排放。
第八步,汉化,重新编译汉化包中的文件,要修改publickey和publickeytoken,编译后将zh_Hans放到应用程序目录下就可以了。

ok,到此通过源码编译DevExpress的工作全部完成,整了一天的时间,挺麻烦的。感觉DevExpress虽然提供了源代码,但是无法直接编译运行,中间留了无数的小坑,就是不想让人轻松的编译通过,虽然都不难,但是很繁琐,估计是为了再卖一次服务吧。

第九步,将控件添加到工具箱,如果手动操作是非常麻烦的,而且要自己分类,很烦。这里直接用DevExpress自己的工具ToolboxCreator.exe来做这个。在DevExpress安装目录下找到,复制出来,一共三个文件:ToolboxCreator.exe、components.xml、toolboxcreator.ini。然后卸载DevExpress试用版。使用管理员权限启动命令行,转到ToolboxCreater.exe所在目录,运行以下指令:
ToolboxCreator.exe /150 /COMPONENTSXML:components.xml /INI:toolboxcreator.ini /PATH:"D:\OpenSourceProject\DevExpress_Sources_v18.1.4\Bin\Framework\mydll"
其中/150是vs的主版本号,对应vs2017,/PATH中的路径是自己编译生成的dll的目录,为了安全起见,可以将自己生成的DevExpress的dll复制到一个专门的目录下,使用命令 cp *.dll mydll  。然后打开vs,可以看到工具箱中已经有了对应的DevExpress分类。

弄完后打开VS2017,看工具箱,很完美。
TIM截图20181211192600.png

评分

参与人数 3贡献 +6 赞扬 +2 收起 理由
羽叶 + 6 赞一个
fidan + 1 很给力
kevenme + 1 感谢分享

查看全部评分

回复

使用道具 举报

0

精华

0

贡献

0

赞扬

帖子
13
软币
148
在线时间
13 小时
注册时间
2018-12-9
发表于 2018-12-12 01:12:54 | 显示全部楼层
不错,编译源码就是折腾
回复

使用道具 举报

0

精华

0

贡献

0

赞扬

帖子
13
软币
148
在线时间
13 小时
注册时间
2018-12-9
发表于 2018-12-13 03:38:05 | 显示全部楼层
还是禁受不住诱惑,恰巧又下载了18.2.3的源码,花了2天时间把winform的控件编译了一遍
基本上按照lz的步骤走就行了,不过对于不太熟悉源码的人来说,找到一个合适的次序比较困难,中间需要尝试比较多次。后面是我最后成功的次序,可以参考一下。
主要是对c#不太熟悉,很多编译错误都需要查询解决办法。补充几个lz没提到的问题吧
1.如果遇到无法修改protected internal ...类型为...,通常都是因为引用了其他程序集的定义,只要签名正确,引用正确应该就不会出现问题,因此通常把引用的库重新编译,当前库重新编译就能解决。开始手工修改代码编译过了,后来发现根本没有必要,就又改回去了。
2.编译design时会发现缺少DevExpress.Design\Properties\Resources.Designer.cs文件,开始用其他版本的代替了一下,然后手工补写函数,后来发现这个文件实际上是由Resource.resx生成的,在Resource.resx点右键,选择运行自定义工具,就会自动生成这个文件。有时会报DevExpress.Data.v18.2.dll找不到,但过一会自己又找到了
3.为了编译18.2.3,安装了最新的vs2017,但发现design需要引用的visualstudio.shell默认安装选项中没有安装,可能需要手工安装。最后引用了Microsoft.VisualStudio.Shell.15.0.dll和Microsoft.VisualStudio.Shell.Design.dll,而且只有在Target FrameWork是4.6的时候才能编译成功,原来的4.5.2总是报错(using Microsoft.VisualStudio.Shell.Design找不到,还有一个ServiceProvider找不到),结果Design都编译到4.6FrameWork下
4.最好一个一个工程点右键编译,这样比较容易发现问题。成功一个,再编译下一个,一般引用都正确编译就很顺利。不过有时vs自动添加的引用有问题,上面有个黄色的感叹号,可能需要删掉重新添加,或是把选项修改一下,比如把特定引用改为false,如果显示解析成功,强签名,版本号都显示出来了,就引用成功了
5.很多模块下面有net.core的工程,这个不需要添加。
6.XtraReports.Design        去掉水晶报表的引用,还有几个引用,不过还是有错误。
data
pdf.core
printing.core
utils
codeparser
codeconverter
sparkline.core
charts.core
Xtracharts
xpo
XtraEditors
XtraBars(依赖XtraEditors)
Dialogs.Core
XtraLayout
        <-Xtratreelist
Office.Core
Images
        RichEdit.Core
        RichEdit.Export
        XtraPrinting
        XtraGrid
                <-XtraDialogs
pdf.drawing
map.core
Xtramap
PivotGrid.Core
XtraPivotGrid
SpellChecker.Core
XtraSpellChecker
DataAccess
XtraGauges.Core
XtraGauges.Presets
XtraGauges.Win
XtraNavBar
XtraVerticalGrid
Diagram.Core
XtraDiagram
XtraWizard
XtraScheduler.Core
XtraScheduler
XtraScheduler.Extensions
XtraPdfViewer
XtraReports
XtraReports.Service
Mvvm
        XtraRichEdit
                 <- Util.UI
        XtraRichEdit.Externsion
Design
XtraEditors.Design
XtraGauges.Design
XtraBar.Design
XtraNavBar.Design
XtraRichEdit.Design
XtraTreeList.Design
XtraVerticalGrid.Design
XtraWizard.Design
XtraSpellChecker.Design
XtraPivotGrid.Design
DataAccess.UI
DataAccess.Design        <-Microsoft.VisualStudio.Shell.15.0.dll
XtraMap.Design
XtraGrid.Design
XtraDiagram.Design
XtraCharts.Wizard
XtraCharts.UI
XtraCharts.Externsions
XtraCharts.Design
XtraReports.Externsions
XtraPrinting.Design
回复

使用道具 举报

0

精华

0

贡献

0

赞扬

帖子
13
软币
148
在线时间
13 小时
注册时间
2018-12-9
发表于 2018-12-13 04:54:15 | 显示全部楼层
结果发现framework 4.5.2编译完之后,在我笔记本上的vs2010彻底用不了了,微软真是让人郁闷
回复

使用道具 举报

0

精华

700

贡献

421

赞扬

帖子
31
软币
1735
在线时间
157 小时
注册时间
2017-2-20
 楼主| 发表于 2018-12-13 10:25:58 | 显示全部楼层
flyjack 发表于 2018-12-13 03:38
还是禁受不住诱惑,恰巧又下载了18.2.3的源码,花了2天时间把winform的控件编译了一遍
基本上按照lz的步骤 ...

写的非常详细!
回复

使用道具 举报

0

精华

0

贡献

0

赞扬

帖子
13
软币
148
在线时间
13 小时
注册时间
2018-12-9
发表于 2018-12-14 00:49:38 | 显示全部楼层
matom 发表于 2018-12-13 10:25
写的非常详细!

主要你把比较容易出的问题都讲清楚了,要不然我也不会有这个动力,不知道是不是18.2.3的代码不太完整,总是报缺少tt,XtraReports.Design也不成功,不过好在我也不用,等需要的时候再研究吧

其实我主要想看看diagram好不好用,现在发现telerik也有,而且对vs2010很友好,依赖的库也少,暂时先研究telerik吧
回复

使用道具 举报

0

精华

157

贡献

40

赞扬

帖子
29
软币
437
在线时间
28 小时
注册时间
2015-12-9
发表于 2018-12-27 10:27:10 | 显示全部楼层
楼主有放出编译后的dll吗
回复

使用道具 举报

0

精华

157

贡献

40

赞扬

帖子
29
软币
437
在线时间
28 小时
注册时间
2015-12-9
发表于 2018-12-27 10:58:16 | 显示全部楼层
flyjack 发表于 2018-12-12 01:12
不错,编译源码就是折腾

资源都在优秀区,进不去,想编译一下最新源码么的下载
回复

使用道具 举报

0

精华

725

贡献

2004

赞扬

帖子
89
软币
5017
在线时间
379 小时
注册时间
2013-10-25
发表于 2019-3-29 11:11:58 | 显示全部楼层
编译后,其自带的安装包附加的一些工具,如添加新项模板就会失败,因为其安装包释放的文件中配置的dll还是其官方的publicKey,需要手工替换,但是由于vs会生成缓存,还得清理vs缓存,很麻烦,不知道是否有更优雅的方法?或者说,官方源码还有一个安装包工程?
回复

使用道具 举报

0

精华

205

贡献

382

赞扬

正版授权组

Rank: 14Rank: 14Rank: 14Rank: 14

帖子
71
软币
1049
在线时间
89 小时
注册时间
2014-2-12
发表于 2020-10-25 18:31:34 | 显示全部楼层
我在编译的过程发现有Microsoft.VisualStudio.Shell.dll 和 Microsoft.VisualStudio.Shell.Design.dll这两个文件没有,我用的是vs2019编译的
回复

使用道具 举报

0

精华

0

贡献

3211

赞扬

帖子
55
软币
6988
在线时间
478 小时
注册时间
2020-2-29
发表于 2020-10-25 19:44:31 | 显示全部楼层
不错,赞一个!
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-22 23:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表