2010年4月7日 星期三

Unit Test + Code Coverage + Strong Name = test failed

在執行測試時,發生了如下的錯誤訊息,而測試並未被執行

Strong name verification failed for the instrumented assembly 'Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Please ensure that the right key file for re-signing after instrumentation is specified in the test settings.

原因

為了取得 Code Coverage的資訊,執行測試時,事實上是在受測的 assembly 增加了一些程式,以方便取得資訊。

然而,如果 assembly 本身就有 strong name的話,被增加了一些程式,當然會被認為不安全了。因此這個機制就無效,也就無法取得 Code coverage 的資訊了。

解法

可見 Instrumenting and Re-Signing Assemblies。我使用的是比較簡單的Disable Signing Verification方法,也就是不檢查某些 assembly 的簽章啦。

解決我的問題,就是在 cmd.exe 下 sn –Vr Microsoft.Practices.Unity.dll 就解決了。

這樣,只會影響執行測試的機器無法檢查指定的 assembly 了。

進階解法

雖然使用上述的方法可以解決該問題,但在該台機器就不檢查這些指定的 assembly?好像也不太對。最好能在測試前執行 sn –Vr assembly.dll,測試後再回復設定。

因此,就可以使用 sn –Vu assembly.dll 語法了。該語法還原 assembly.dll 成必須檢查 strong name。另外,在執行測試的設定(通常是 LocalTestRun.testrunconfig)上,設定 setup and cleanup scripts,執行這些指令就可以了。

如下圖。setup.cmd 內放 sn –Vr assembly.dll , cleanup.cmd 放sn –Vu assembly.dll

image

2010年4月2日 星期五

為程式碼減肥

在開發的過程中,會不斷的新增及修改程式。雖然使用了 TDD (Test-driven development)開發方法,一定程度上不會寫出不必要的程式,但人非聖賢,難免還是會留下一些不必要的註解及程式。

要下是我常見的毛病:

  1. 宣告了變數卻從不使用。
  2. 指定了變數值(assign),卻從不讀取(comsume)
  3. 宣告了 private method (方法),卻沒有使用過。
  4. etc

這樣一來,程式碼難免愈來愈來多, assembly size也就愈來愈大,執行時就需要更多載入時間,導致維護困難與效能不佳的問題。

有沒有工具可以幫我們找出一些不要的程式「脂肪」呢?在 Visual Studio 2005 後,就多了一個 Code Analysis 工具,可以幫我們找出許多程式碼的問題。

image

在方案總管的某一專案上按右鍵/內容,可以找到 Code Analysis 頁。

image

在 Performance Rules中,可以找到一些有用的 rule,可用來檢查上述不必要的程式碼。

  • CA1804: 未使用的區域變數。這個最常犯了,一定要選取
  • CA1805: 不必要的初始值。
  • CA1809: 過多的區域變值。
  • CA1811: 未被呼叫的私有程式碼。見 CA1811: Avoid uncalled private code
  • CA1823: 未被使用的私有成員變數 (private field)。

自己已經覺得有程式碼潔癖了,但仍使用Code analysis 找到不少的程式脂肪,真窘。

在 Code Analysis 還有許多寶物等待我們去挖掘呢。

PS: 有些英文實在難以翻譯出適當的中文敘述,請大家見諒。

2010年3月31日 星期三

刪除 workitem 及 workitem type definition

在 Team Foundation Server 2008上,建立了一個錯誤或不再需要的 work item,那該怎麼辦呢?

這時候需要安裝 Team Foundation Server Power Tools 了。
安裝完畢後,可以在 C:\Program Files\Microsoft Team Foundation Server 2008 Power Tools\ 下找到 tfpt.exe 指令。

刪除 workitem 1
tfpt destroywi /server:tfsservername /workitemid:1

刪除 workitem type definition
tfpt destroywitd /server:tfsservername /project:projectname /workitemtype:witdname

2010年3月30日 星期二

Ajax Enabled WCF Service on IIS 7 always return 404 error

最近 study 了 Ajax enabled WCF Service,覺的著實好用。於是想放到 MOSS 上。而 MOSS 是位於 Windows Server 2008 的 IIS 7 上。一試,就發現 IIS 7 執行 svc 時是正常的,但一執行 *.svc/js 就會回傳 404 (not found) 的錯誤。

然而,在 IIS 6 (windows 2003) 上不會發生這個問題。

花了一整天,都在處理這個 Issue。一度還以為是 moss 的問題。

現在終於找到了原因。在此將完整的步驟記錄下來。

  1. 建立一個 WCF Service. 並且記得要 加上[ServiceContract],[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  2. 在 config 上,使用 webHttpBinding, 並啟用 <enableWebScript/> 的 endPoint behavior
  3. 部署程式到 Windows 2008 的 IIS 7 上。此以瀏覽器輸入網址 *.svc/js 會回傳 404 錯誤
  4. 這一步就是我漏掉的。打開 IIS 管理員,找到該網站(Site),於 "處理常式對應”(Handler Mappings)上,新增一個指令對應。

要求路徑:*.svc
執行檔:%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
名稱:svc-ISAPI-2.0

       如下圖。

image

這樣一來就解決了問題。

2010年3月25日 星期四

C# 鍵盤對照表

想要開發時增加生產力,一定要了解快速鍵。

請參照 Visual C# 2008 Keyboard Shortcut Reference PosterVisual C# 2005 Keyboard Shortcut Reference Poster

[2010/04/29] 補上 VS 2010 Key binding Card

下載的 pdf 檔,有時真的不知道在說些什麼,因為說明實在太精簡了,而給的範圍也太大了些。此時,知道別的專家都使用哪些快速鍵是個好方法,此時參考 http://stackoverflow.com/questions/98606/favorite-visual-studio-keyboard-shortcuts 。這裡反而是較快上手的地方呢。

最完整的地方,當然還是 msdn 了。

2010年3月18日 星期四

Windows 2000, XP SP2 and Vista 終止技術支援

客戶是老大,但有些事不是出錢就能解決的。

常見的問題,是客戶的平台太舊了,微軟不支援,當然身為廠商的我們,也就難以支援了。畢竟我們使用微軟的技術來支援。

Windows 2000 Professional及Windows 2000 Server版本將於美國時間2010年7月13日停止技術支援服務。
微軟將停止Windows XP SP2版本的安全更新,請您記得安裝更新Windows XP Service Pack 3。
Windows Vista (若沒安裝 任何的 Service Pack的話)將在美國時間2010年4月13日停止技術支援服務,請您記得安裝更新Windows Vista Pack 2 。

一句老話:電腦硬體都會汰舊換新,那軟體的版本當然也會。

2010年2月27日 星期六

程式語言趨勢

長久以來,各家 programming language 都會標榜自家的語言多好,其他語言將如何如何。其實,語言只是工具。語言是否能成為主流,要看大環境、使用的平台、廠商是否支持、原廠是否持續力推等等。

TIOBE Programming Community Index for February 2010 這裡的調查結果發現,Java 仍然是使用率最高的語言。Java 已死的說法不盡然。

我喜歡看趨勢,而非一時的高低。在該資料中,也可發現 Java 長期來,由2001年的 27% 下降到 2010年的17.5%。同一時間的C# 由 0.1% 不斷地上升到 5%, PHP 由 1.5% 上升到 10.0%。若由此觀察,Java 語言不斷地流失市佔率也是事實。

而另一個事實,靜態語言與動態語言的比例趨勢,看來動態語言是大幅提升到了不可忽視,甚至必需學習的地步。到目前為止,動態佔6成,靜態佔4成。由此也可了解微軟後來為何出了 F#語言,支援IronPython, IroRuby等動作。

Share with Facebook