運行環境: Visual Studio
NET
介紹
我們每一個從原有的開發環境轉移到VS
NET下的用戶
都遭遇到不少的阻礙
我所碰到的一個障礙就是:我原有的那些macro無法繼續工作了
現在的這個編譯序列號自動增長工具是從很多人的代碼片斷組合而成的
雖然它並不完善
而且缺乏一些特性
但它至少為進一步開發提供了一個堅實的基礎
目標 這裡是自動編譯序列號的需求:
在每一次release編譯的時候
自動增加保存在一個單獨文件中的編譯序列號
這個文件將被加入到我的項目中
自動記錄編譯的日期和序列號
代碼分析
我的第一個任務是找到一個能夠替代VS
中
Application_BeforeBuildStart()的事件
VS
NET的設計者為我們提供了非常容易使用的編譯事件:
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