您的位置:首页 > 其它

DevExpress源码编译总结 z

2015-09-18 11:45 274 查看
本篇文章内容包括基础知识(GAC、程序集强签名、友元程序集)、编译过程、注册GAC、添加工具箱、多语言支持、运行时和设计时调试

源码地址 链接:http://pan.baidu.com/s/1eQm1ZFk 密码:39qw

关于编译源码,前前后后折腾了太久,自己折腾,到官网折腾,到DXPER折腾,今天,总算有个结局了

[align=left]编译环境[/align]
[align=left]工具:Visual Studio 2010[/align]
[align=left]源码:DXperience source code14.2.3.14339(源码已经整理好,不需要任何改动,解决方案文件放在sln\WinForm\WinForm.sln)[/align]
[align=left]源码结构[/align]



[align=left]为了更好地验证最后的编译成果,如果已经安装了DevExpress官方版,请先卸载,编译DevExpress的源码并不依赖于DevExpress官方版的安装。[/align]
[align=left]编译目标[/align]
[align=left]1. 将DevExpress中WinForm相关组件全部编译[/align]
[align=left]2. 编译完成后能手工添加到工具箱[/align]
[align=left]3. 从工具箱中拖放控件到Form中,设计视图能正常工作,运行时也正常。[/align]
[align=left]4. 提供多语言支持[/align]
[align=left]5. 能调试运行时和设计时[/align]
[align=left]编译基础[/align]
[align=left]在动手编译之前,先复习一下基础知识[/align]
[align=left]GAC[/align]
[align=left]1. 什么是GAC[/align]
[align=left]GlobalAssembly Cache,全局程序集缓存[/align]
[align=left]2. 为什么要注册GAC[/align]
[align=left]注册到GAC中的程序集能被整个系统共享[/align]
[align=left]3. 如何注册及取消注册[/align]
[align=left]使用.net framework自带的工具gacutil[/align]
[align=left]gacutil/i [abc.dll],将当前目录下的abc.dll文件注册到GAC[/align]
[align=left]如果要注册的文件比较多,可以使用列表文件,后面在DevExpress源码编译完成后,生成的文件比较多,可以使用批量注册,命令为gacutil /il list.txt,其中list.txt的格式如下:[/align]
[align=left]DevExpress.BonusSkins.v13.2.dll[/align]
[align=left]DevExpress.Charts.v13.2.Core.dll[/align]
[align=left]DevExpress.CodeConverter.v13.2.dll[/align]
[align=left]……[/align]
[align=left]每行一个文件名[/align]
[align=left]取消注册与注册类似,可以参考.net framekwork工具帮助[/align]
[align=left]程序集强签名[/align]
[align=left]1. 什么是程序集强签名[/align]
[align=left]在生成程序集时,指定一个私钥文件(该私钥文件为私有,不会对外公开),经过这样的方式编译后的程序集称为强签名程序集。[/align]
[align=left]2. 为什么要使用签名[/align]
[align=left]l 保证生成的程序集唯一性,强签名的程序集都有一个公钥,只有用特定私钥生成的程序集才会有该公钥。[/align]
[align=left]l 防止程序集被非法篡改,一旦强签名后,程序集内部会保存公钥,加载该程序集时,CLR会验证该公钥,如果被非法篡改,则公钥验证失败,会抛出异常。[/align]
[align=left]l 未签名的程序集无法注册GAC[/align]
[align=left]3. 如何使用签名[/align]
[align=left]l 生成私钥(PS:这个私钥只是演示用,源码中使用的并不是这个私钥)[/align]
[align=left]使用.net framework工具sn,sn -k MyKey.snk,生成的私钥文件存放在当前目录下的MyKey.snk[/align]





[align=left]l 查看公钥[/align]
[align=left]首先将公钥写入文件[/align]





[align=left]然后再查看公钥[/align]



[align=left]4. 在VS中指定签名[/align]
[align=left]在VS中指定签名至少能通过两种方式[/align]
[align=left]一、 在AssemblyInfo.cs文件中指明签名文件路径[/align]



[align=left]二、 在工程属性栏中的“签名”标签[/align]



[align=left]以上两种方式任选其一,第二种方式在VS2005之后才支持,现在DevExpress推荐采用第二种,我们的源码中签名全部采用这种方式。[/align]
[align=left]5. DevExpress的签名[/align]
[align=left]DevExpress公司在发布产品时,使用了私钥对产品进行了强签名,目前只知道其公钥标记为b88d1754d700e49a,如果你的程序加载的程序集公钥为b88d1754d700e49a,则证明使用的是DevExpress公司提供的,而不是其它人提供的[/align]
[align=left]6. 源码中的签名[/align]
[align=left]在编译源码前,需要生成我们自己的私钥,生成的私钥放在DevExpress.Key文件中,解决方案中所有的工程都使用该签名,这里可以看一下我们的公钥[/align]



[align=left]这也就意味着,我们编译出来的程序集公钥标记为94a041a7af35fb7f,其它任何人都无法仿制与篡改。(PS:这个公钥可以到src\DevExpress.Key\key.txt文件中找到)[/align]
[align=left]友元程序集[/align]
[align=left]1. 什么是友元程序集[/align]

认情况下,程序集里使用internal修饰符,则该类型或成员只能在该程序集内部访问,如果需要让外部也能访问到,这就需要友元程序集。[MSDN]友
元程序集是一种能够访问其它程序集的internal类型和成员的程序集,如果将程序集指定为友元程序集,则不再需要将类型和成员标记为公共,以使其他程
序集可以访问它们
[align=left]2. 为什么需要友元程序集[/align]
[align=left]l 单元测试,测试代码在另一个程序集运行,但需要访问正在测试的程序集internal成员[/align]
[align=left]l 类库分开在多个程序集中,程序集需要互相访问内部internal成员[/align]
[align=left]3. DevExpress中的友元程序集[/align]
[align=left]DevExpress中很多的基础功能放在DevExpress.Data中,该程序集有很多友元程序集,打开DevExpress.Data下的AssemblyInfo.cs,可以清楚地看到它的友元程序集[/align]



[align=left]即,在以上这些模块中,可以直接访问DevExpress.Data中的internal类型。[/align]
[align=left]其它模块的友元程序集与DevExpress.Data类似。[/align]
[align=left]编译过程[/align]
[align=left]1. 代码获取[/align]
[align=left]代码已经全部打包成压缩文件[/align]
[align=left]2. 修改签名[/align]
[align=left]私钥已经生成好,工程已经使用该私钥签名,不需要修改。如果想使用自己的签名,需要按照以下步骤:[/align]
[align=left]一、 使用.net framework自带工具生成一份强签名文件,名称为StrongKey.snk,覆盖src\DevExpress.Key下的同名文件[/align]
[align=left]二、 打开sln\WinForm\WinForm.sln,在整个解决方案中,替换所有引用公钥标记和公钥的地方[/align]





[align=left]3. 编译[/align]
[align=left]打开sln\WinForm\WinForm.sln,然后重新生成解决方案[/align]
[align=left]后续工作[/align]
[align=left]注册GAC[/align]
[align=left]生成后的部分文件如下:[/align]



[align=left]另外Design文件夹中包含了需要设计时支持的程序集,将生成的这些DLL文件注册进GAC中(如何使用列表批量注册,可参考前文),Design中的DLL也要注册。[/align]
[align=left]工具箱添加[/align]
[align=left]打开VS,新建一个WinForm项目,打开工具箱,空白处右键,选择“添加选项卡”[/align]



[align=left]然后自己输入一个名称,这里取名为“DevExpressBuild”,然后右键,选择“选择项”[/align]



在弹出的对话框中选择“浏览“,然后选择GAC中某个DevExpress
DLL,这里以ChartControl为例,选择C:\Windows\Microsoft.NET\assembly\GAC_MSIL
\DevExpress.XtraCharts.v14.2.UI下的文件夹下的DLL。确定后,能看到工具箱添加成功,如下:



[align=left]其它控件工具箱的添加过程类似。(PS:此处有人有疑问,你怎么知道ChartControl放在DevExpress.XtraCharts.v13.2.UI这个DLL文件中,关于具体的控件放在哪个DLL中,DevExpress自带的文档都有详细的说明,请参考)[/align]
[align=left]成果检验[/align]
[align=left]至此,DevExpress的编译已经完成,下面来检验编译后的成果。[/align]
[align=left]还是上面的工程,直接拖放工具箱中的ChartControl到窗体中,终于看到自己编译的成果了[/align]



[align=left]随便选择一种类型,点击“Finish”,注意看VS中的引用列表[/align]



[align=left]已经自动为我们引用了所需的DLL,在部署时,只需要将这些DLL打包部署到客户机器上即可。[/align]
[align=left]已经很接近完美了,下面看看多语言支持[/align]
[align=left]多语言支持[/align]

果使用的是安装版的DevExpress,可以到官方网站下载所需的资源文件,但是我们是自行编译的,无法直接使用官方提供的强签名的资源文件。这就需要
我们自行编译语言的资源文件了,这个编译也很简单,因为解决方案全部设置好了(如果源码编译时使用了自己的签名,需要将
src\DevExpress.Key\StrongKey.snk拷贝到
dxKB_A421_DXperience_v14.2_(2014-12-16)\DevExpress.Key\下覆盖同名文件),只需要打开
dxKB_A421_DXperience_v14.2_(2014-12-16)\Localization.sln,重新生成,生成的产物路径为
dxKB_A421_DXperience_v14.2_(2014-12-16)\DevExpress.Dll,假如我们需要控件支持汉语,则进入
DevExpress.DLL\zh-CN,将文件夹里面所有的DLL注册进GAC
[align=left]关闭并重新打开刚才新建的工程,在刚才创建的ChartControl基础上,创建一个Ribbon,可以看到,界面已经汉化了。[/align]



[align=left]虽然官方提供的资源汉化率不是100%,但在运行时已经基本能满足要求了。[/align]
[align=left]源码调试[/align]
[align=left]运行时调试[/align]
[align=left]既然通过源码编译的,那么调试应该不是什么大问题了[/align]
[align=left]例如上面的工程中,我想在运行时,向图表中添加一个点,我想看看这个点的添加过程[/align]



[align=left]AddPoint事件处理代码只有一句[/align]



[align=left]在DevExpress.XtraCharts.UI工程中的ChartControl.cs文件中Series[/align]
[align=left]属性添加断点,如下[/align]



[align=left]然后调试工程,点击“AddPoint”按钮,命中了断点[/align]



[align=left]其它的调试都是类似过程。[/align]
[align=left]设计时调试[/align]
DevExpress
控件对VS设计时支持得很好,在设计阶段,可以非常直观地设置控件属性。如果想了解DevExpress在设计时做了哪些事情,可以对设计时进行调试。设
计时调试与运行时调试不太一样,设计时调试实际上是使用一个VS调试另一个VS,这里我们举一个例子,我想看看上面这个ChartControl控件在设
计时,点击“关于”时做了哪些事情



一、
首先在工程属性中,选中“调试”标签页,启动操作选择“启动外部程序”,后面的路径选择VS2010所在的路径,默认为C:\Program
Files(x86)\Microsoft Visual Studio
10.0\Common7\IDE\devenv.exe,也即我想调试另外一个VS
[align=left]二、 添加断点[/align]

一步断点的位置根据自己的需求,本次我们的断点设置在DevExpress.XtraCharts.Design工程中的Designers.cs文件中
的ChartControlDesigner类中的OnAbout方法,如下(PS:此处有人有疑问,你怎么知道点击“关于”后进入这个函数的,实际上,
调试代码前,需要大概了解代码)



[align=left]三、 开始调试[/align]
[align=left]F5启动调试,这时会打开另一个VS,在这个新的VS中打开刚才的工程,点击窗体上ChartControl控件右侧小箭头,在弹出的界面中选择“关于”,VS果断命中断点,如下[/align]



[align=left]实际上官方提供的14.2.3安装版里的ChartControl控件点击“关于”是没有任何反应的,这段代码是我自己加上的,也是起作用的,弹出的对话框如下[/align]



[align=left]这就是传说中设计时调试,注意,此时应用程序并没有运行起来,这种调试方式对于开发自定义控件非常有用[/align]
[align=left]Q&A[/align]
[align=left]Q:工具箱中拖放控件到Form中,没有反应或者提示各种错误[/align]
[align=left]A:这种情况一般都是因为没有注册生成目录中Design文件夹下的以”.Design.dll”为结尾的文件,要想在VS中对控件进行设计,这些DLL必须注册到GAC[/align]
[align=left]Q:以.Design.dll为结尾的文件,在部署时,需要拷贝到客户机器上吗?[/align]
[align=left]A:不需要,这些DLL在运行时不需要[/align]
[align=left]Q:从工具箱中拖放一个控件到Form中,如何让VS自动引用所需的DLL[/align]
[align=left]A:将依赖的DLL注册到GAC[/align]
[align=left]Q:使用源码编译后的程序集还需要破解吗?[/align]
[align=left]A:不需要,在工程引用中,引用的DLL文件属性中,“复制本地”设置为true,然后将输出目录中的文件进行打包,拷贝到其它机器即可[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: