熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.NET的自動序列號工具

2013-11-13 10:06:35  來源: .NET編程 
    運行環境: Visual Studio NET

介紹

我們每一個從原有的開發環境轉移到VSNET下的用戶都遭遇到不少的阻礙我所碰到的一個障礙就是:我原有的那些macro無法繼續工作了

現在的這個編譯序列號自動增長工具是從很多人的代碼片斷組合而成的雖然它並不完善而且缺乏一些特性但它至少為進一步開發提供了一個堅實的基礎

目標

這裡是自動編譯序列號的需求:

在每一次release編譯的時候自動增加保存在一個單獨文件中的編譯序列號這個文件將被加入到我的項目中

自動記錄編譯的日期和序列號

代碼分析

我的第一個任務是找到一個能夠替代VS Application_BeforeBuildStart()的事件VSNET的設計者為我們提供了非常容易使用的編譯事件:

OnBuildBegin

OnBuildDone

OnBuildProjConfigBegin

OnBuildProjConfigDone

  這些事件句柄的命名規則有一點誤導我們不希望使用OnBuildBegin因為即使我們同時針對多種配置(release debug等等)進行編譯它也只會被執行一次這使得難以只在編譯release版本的時候增加編譯序列號OnBuildProjConfigBegin就能夠在針對每一種配置編譯的時候被執行並且還提供一個名為ProjectConfig的字符串參數來描述當前所進行的編譯使用的是哪一種配置

大部分的任務是在OnBuildProjConfigBegin事件處理函數中完成的 它還使用了兩個輔助macro:

WriteToLogFile

WriteToOutputBuildPane

這兩個宏都可以被寫入到OnBuildProjConfigBegin事件處理函數中或者在不用時刪除

代碼



OnBuildProjConfigBegin event handler



Private Sub BuildEvents_OnBuildProjConfigBegin(

ByVal Project As String

ByVal ProjectConfig As String

ByVal Platform As String

ByVal SolutionConfig As String)

Handles BuildEventsOnBuildProjConfigBegin

abort if build type is debug

If InStr( ProjectConfig Debug ) Then Exit Sub

get ver filename

Dim res_filename As String

res_filename = DTESolutionFullName

res_filename = PathChangeExtension(res_filename ver)

open VERSION FILE and increment build number

Dim msg_text As String

If FileExists(res_filename) Then

Dim line As String

Try

Dim sr As StreamReader = New StreamReader(res_filename)

line = srReadLine()

srClose()

Catch ex As Exception

ModuleWriteToOutputBuildPane(vbCrLf & _

Version file read failed : &

exMessage & vbCrLf)

End Try

line = Right(line lineLength )

Try

Dim sw As StreamWriter = FileCreateText(res_filename)

swWriteLine(#define BUILD_NUM {} line + )

swClose()

Catch ex As Exception

ModuleWriteToOutputBuildPane(vbCrLf & _

Version file write failed : &

exMessage & vbCrLf)

End Try

msg_text = Build number : & line + & & Now

ModuleWriteToOutputBuildPane(vbCrLf & msg_text & vbCrLf)

ModuleWriteToLogFile(msg_text)

Else

Try

Dim sw As StreamWriter = FileCreateText(res_filename)

swWriteLine(#define BUILD_NUM )

swClose()

Catch ex As Exception

ModuleWriteToOutputBuildPane(vbCrLf & _

Version file write failed : &

exMessage & vbCrLf)

End Try

msg_text = Build number : & Now

ModuleWriteToOutputBuildPane(vbCrLf & msg_text & vbCrLf)

ModuleWriteToLogFile(msg_text)

End If

End Sub



write text message to a log file



Sub WriteToLogFile(ByVal msg_text As String)

Dim log_filename As String

log_filename = DTESolutionFullName

log_filename = PathChangeExtension(log_filename logtxt)

Try

Dim sw As StreamWriter = FileAppendText(log_filename)

swWriteLine(msg_text)

swClose()

Catch ex As Exception

MsgBox(Log file write failed : & exMessage)

End Try

End Sub



write a text message to the build pane of the output tool window



Sub WriteToOutputBuildPane(ByVal msg_text As String)

Create a tool window handle for the Output window

Dim win As Window = DTEWindowsItem(EnvDTEConstants _

qvsWindowKindOutput)

Create handles to the Output window and its build pane

Dim OW As OutputWindow = winObject

Dim OWp As OutputWindowPane

OWp = OWOutputWindowPanesItem(Build)

Add a line of text to the output pane

OWpOutputString(msg_text & vbCrLf)

End Sub

  集成

  注意如果你還沒有一個Macro Project那麼先要創建一個你需要打開一個Macro Project並顯示在VS Macros IDE (譯者注:你可以通過快捷鍵Alt + F或者點擊View > Other Windows > Macro Explorer打開宏浏覽窗口雙擊其中一個宏進行編輯)

每一個宏工程擁有一個名為EnvironmentEvents的頁面雙擊打開它

從類名稱下拉列表中選擇BuildEvents

從方法名下拉列表中選擇OnBuildProjConfigBegin

增加兩個引用申明(import)

異常類的申明需要引用System名稱空間 文件的操作類申明需要引用SystemIO

在OnBuildProjConfigBegin方法中添加

雙擊打開Module頁面

Module是IDE使用的一個默認頁面名稱如果你使用了不同的名稱 那麼一定要修改OnBuildProjConfigBegin中的對應名字空間

添加兩個輔助方法添加對 System和SystemIO的引用申明

運行

  保存編輯結果然後編譯檢查是否有錯誤編譯成功後就可以直接使用了使用很簡單這段代碼會在每次編譯時被執行


From:http://tw.wingwit.com/Article/program/net/201311/12586.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.