轉(zhuǎn)帖|其它|編輯:郝浩|2011-12-29 21:21:32.000|閱讀 822 次
概述:本主題的目標(biāo)是通過對(duì)XAF 源碼的重新編譯再到重新分包部署來學(xué)習(xí)、理解MSBuild的一些常用用法。為什么用XAF來學(xué)習(xí)呢,最重要的原因是我正在使用它。而且對(duì)于重新編譯XAF的工作看上去不是玩具,而且在實(shí)際的使用當(dāng)中真正能用得上。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本主題的目標(biāo)是通過對(duì)XAF 源碼的重新編譯再到重新分包部署來學(xué)習(xí)、理解MSBuild的一些常用用法。
為什么用XAF來學(xué)習(xí)呢,最重要的原因是我正在使用它。而且對(duì)于重新編譯XAF的工作看上去不是玩具,而且在實(shí)際的使用當(dāng)中真正能用得上。
XAF 是什么,如果你熟悉他那正好,如果你還不太清楚,你可以在園內(nèi)搜索一下。為了不偏離主題,在此不做過多的介紹,這不是很影響下面的討論。要是能用簡(jiǎn)單的幾 句話描述那就是:XAF是一個(gè)優(yōu)秀的企業(yè)級(jí)應(yīng)用程序框架。你只需要負(fù)責(zé)處理實(shí)際的業(yè)務(wù)邏輯??蚣軙?huì)自動(dòng)為你生成數(shù)據(jù)庫(kù)(使用XAF中的orm工具 XPO)??蚣苓€可以為你生成非常強(qiáng)大的UI展現(xiàn)層(其中用到DEVExPress套件)。聽起來像是神話,當(dāng)你潛心研究開源項(xiàng)目的時(shí)候不妨看看他,雖然 這是一個(gè)商業(yè)的產(chǎn)品。但是當(dāng)你真正看到他的強(qiáng)大的時(shí)候,你就會(huì)不由的感嘆,什么是城鄉(xiāng)差距。呵呵,無意貶低開源項(xiàng)目,必定側(cè)重點(diǎn)不同。
在詳細(xì)的說明一下本主題的議題。當(dāng)你安裝了XAF的源碼包之后,你可能想通過單步調(diào)試來監(jiān)測(cè)一下到底XAF為你做了一些什么,但是調(diào)試器沒有本法追蹤到 DLL內(nèi)部的源代碼。這時(shí)你需要重新編譯源碼包使調(diào)試器便能追蹤到DLL內(nèi)部的源碼。(看XAF的源碼也是一件即令人興奮又令人沮喪的事情)。用VS編譯 項(xiàng)目的時(shí)候會(huì)在BIN目錄生成一個(gè)和DLL文件同名但以.pdb為后綴名的文件。當(dāng)啟用調(diào)試的時(shí)候調(diào)試器會(huì)通過這個(gè)文件找到相應(yīng)的程序源碼。完整的XAF 源碼包大概包含80多類項(xiàng)目至少要生成100個(gè)以上的DLL文件。也許在你的項(xiàng)目里面實(shí)際用不了這么多。這些DLL互相引用,如果要手工去建立解決方案, 然后添加引用,無疑是一件很耗時(shí)又令人苦惱的事情。令人欣慰的是官方為我們提供了編譯腳本。其實(shí)就是運(yùn)用了MSBuild,gacutil 的一些批處理文件。
我們先來看看devexpress官方對(duì)于重新編譯的一些指南。
以下是簡(jiǎn)單的描述:
1、先使用它的安裝包安裝組件。
2、用SN工具生成你自己的強(qiáng)命名文件,將其拷貝到指定目錄。
3、找到安裝目錄下的所有的DLL文件刪除它們。運(yùn)行腳本清除devexpress(GAC)全局程序集緩存.
4、在源碼目錄運(yùn)行編譯腳本。
5、在工具箱注冊(cè)組件。
(注意:如果你的源碼包不是完整的,就不能刪除部分DLL)
幾個(gè)步驟里涉及到了多個(gè)非常重要的知識(shí)點(diǎn),和幾個(gè)似乎不太常用的幾個(gè)工具。
1、強(qiáng)名稱程序集和Sn.exe工具
強(qiáng)名稱主要是一些大公司為了用于程序集的統(tǒng)一命名,另一個(gè)目的是使程序集無法偽造。但是 Richard Grime介紹了一種方法可以在某種程度上破解強(qiáng)名稱)開始是基于CLR1.1版本的一個(gè)Bug.微軟在.net2.0中修復(fù)了這個(gè)bug,隨后Richard Grime
又在他的文中補(bǔ)充了2.0/3.0版本強(qiáng)名稱的破解方法。但事實(shí)上最牛X的Cracker來自中國(guó),dev的注冊(cè)程序幾乎是和官方同步更新(Danny 我們都很期待你的文章,希望能有幸看到)。當(dāng)你引用一個(gè)第3方的控件的時(shí)候,強(qiáng)名稱有可能會(huì)給你帶來一些麻煩。但實(shí)際上強(qiáng)名稱并不是主要用來解決安全問 題。如果你編寫控件,那么給你的項(xiàng)目加一個(gè)強(qiáng)命名就是必須的,只有擁有強(qiáng)名稱的程序集才能夠放入到GAC中。只有放入到GAC中的程序集才能夠在VS的工具箱中被引用。所以控件、和組件必須使用強(qiáng)名稱。
強(qiáng)名稱使用Sn.exe命令行工具來創(chuàng)建。當(dāng)然也可以使用vs項(xiàng)目屬性--簽名的可視化工具生成。
一般常用的類似以下命令。
使用命令行又是要比VS方便。接下來我們到D盤把我們剛剛生成的私鑰文件拷貝到DevExpress.Key\文件夾下。
2、XCopy與GAC
接下來要做的事情是刪除Dll文件,和清除dev組件的GAC.
.NET 程序集的部署通常有兩種策略。 我喜歡是XCOPY部署,不用訪問注冊(cè)表,不訪問window活動(dòng)目錄。比那些亂七八糟的綠色版軟件都干凈。即使用MSI安裝服務(wù)都很干凈。(有一天我偶 然發(fā)現(xiàn),所謂的綠色版軟件就是一個(gè)批處理文件用來寫注冊(cè)表,在卸載的時(shí)候就算刪了文件夾,還是會(huì)給注冊(cè)表留下了垃圾,通常這個(gè)批處理也會(huì)篡改你的主頁(yè))
既然XCopy那么好用為什么還需要GAC呢,我覺得這個(gè)微軟自家最需要了,微軟為了讓自己的操作系統(tǒng)原生態(tài)的支持.net各個(gè)版本號(hào)的程序集而設(shè)計(jì)的。 比如:如果你的web應(yīng)用程序如果是在2.0環(huán)境下開發(fā)的,你的程序就會(huì)引用GAC中的2.0相應(yīng)的程序集DLL。如果是3.5的, 你的程序就會(huì)引用3.5 的版本。像對(duì)dev這樣的頻繁更換產(chǎn)品版本的公司也是極受用的。還有可能是對(duì)于性能上的考慮吧。但對(duì)于大多數(shù)的企業(yè)應(yīng)用來說文件夾部署更實(shí)用一些。
我們要如何查看并清除GAC里的DLL呢?當(dāng)我們?cè)诎惭b.net平臺(tái)的時(shí)候會(huì)自動(dòng)的安裝一個(gè)名為shfusion.dll的外殼擴(kuò)展,它可以使我們?cè)谫Y源 管理器里瀏覽GAC文件夾,通常情況下我們可以當(dāng)他不存在。不要試圖在這種情況下修改GAC.若要修改GAC文件夾需要用到.net提供的 GACUtil.exe工具。要卸載GAC程序集MSDN提供了兩種方式。
使用 Windows 界面
導(dǎo)航到位于 %systemdrive%\Windows\Assembly 的 GAC。
右鍵單擊在您的應(yīng)用程序中包括的每個(gè)程序集文件,單擊“卸載”,然后單擊“是”進(jìn)行確認(rèn)。
使用命令行
按以下方法打開 Visual Studio 命令提示符:?jiǎn)螕?ldquo;開始”,依次指向“所有程序”、Microsoft Visual Studio 2008、“工具”,然后單擊“Visual Studio 2008 命令提示”。
在命令提示符下鍵入以下命令:
gacutil /u <完全限定的程序集名稱>
在此命令中,程序集名稱是要從 GAC 中卸載的程序集的名稱。
下面的示例從 GAC 中移除名為 hello.dll 的程序集。
gacutil /u "hello,Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDE
dev的腳本中使用了另一種更直接的方式。這可能需要你要有計(jì)算機(jī)管理員權(quán)限。
rd /s /q %GACPATH%DevExpress.Data.%dxver%
rd /s /q %GACPATH%DevExpress.Data.%dxver%.Linq
rd /s /q %GACPATH%DevExpress.Design.%dxver%
%GACPATH%代表全局緩存目錄,可以用命令行工具直接清除目錄樹。如果你用命令行工具進(jìn)入全局緩存目錄,你會(huì)發(fā)現(xiàn)所有的dll實(shí)際上也是一個(gè)目錄
這樣就可以編寫批處理來卸載GAC程序集。
3、MSBuild與MSBuild.exe工具
MSBuild是一個(gè)相對(duì)大的概念,旨在統(tǒng)一以往的各種編譯技術(shù),它是一種特有的XML格式。VS所生成的.Proj、CSproj、vbproj等文件都是以MSbuild XML 格式撰寫的。更多的信息請(qǐng)參閱MSDN.
在編譯XAF的過程中用到了MSBuild.exe工具的腳本只有一句(里面用到了一些替代符如 :%configuration%=Debug)
%msbuild% /nologo /t:Rebuild /verbosity:quiet /p:Configuration=%configuration%;Platform=AnyCPU
他將自動(dòng)查找目標(biāo)完成我們的生成工作。這個(gè)過程可能需要一段時(shí)間。
4、用gacutil注冊(cè)程序集
之后要把成生成的dll注冊(cè)到GAC中,這時(shí)用到 gacutil工具
gacutil.exe 工具有很多參數(shù)。常用的命令如下:
gacutil /i mydll.dll
dev的部分腳本
cd DevExpress.Dll
%gacutil% -i DevExpress.BonusSkins.%DXVER%.dll
%gacutil% -i DevExpress.Data.%DXVER%.Compact.dll
%gacutil% -i DevExpress.Data.%DXVER%.dll
%gacutil% -i DevExpress.OfficeSkins.%DXVER%.dll
%gacutil% -i DevExpress.Tutorials.%DXVER%.dll
%gacutil% -i DevExpress.Utils.%DXVER%.dll
%gacutil% -i DevExpress.Web.ASPxEditors.%DXVER%.dll
%gacutil% -i DevExpress.Web.ASPxGridView.%DXVER%.dll
%gacutil% -i DevExpress.Web.ASPxGridView.%DXVER%.Export.dll
執(zhí)行dev的腳本,所有的dll將被加載到GAC中。至此,我們?cè)儆胐ev的工具箱組冊(cè)工具注冊(cè)生成的dll 編譯就此結(jié)束。
接下來的工作是我想把重新編譯過像項(xiàng)目再重新打包,以方便分發(fā)給同事一起使用,我將在細(xì)致看過MSI\CAB\XCOPY\Clickonce和NTD這幾種部署方法,之后選擇一種合適的方法。
以上的描述有不對(duì)的地方希望大家給予指出。發(fā)現(xiàn)我表達(dá)能力有些欠缺,閱讀不暢也希望大家諒解。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載