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