Posts
T4 template - Auto generate ConnectionString's wrapper class
在 .Net 程式中要使用資料庫的連線字串,多半我們會將資料庫的連線字串設定在 Config 檔中,然後透過 ConfigurationManager.ConnectionStrings 帶入對應的 Key 去將之取出來使用。
用這樣的撰寫方式,連線字串名稱打錯無法立即的被意識到,連線字串名稱調動時也很容易漏改,造成系統運行時的錯誤。因此有的人會將連線字串這邊再包一層,透過這層物件的屬性去取得連線字串,將連線字串的修改都在這層處理,減少人為造成的錯誤。
然而這樣的做法並無法完全解決問題,因為多包的那層還是人工下去做的,仍舊是無法避免連線名稱鍵錯的問題,連線字串變動時仍是會有改錯的可能。故這邊筆者嘗試使用 T4 template,讀取專案的 config 檔,動態產生強型別物件,提供連線字串給系統使用。
首先我們要為專案加入一個 t4 template 檔。
然後將其程式碼替換成下面這樣。
<#@ template debug ="true" hostspecific="True" language= "C#" #> <#@ assembly name ="EnvDTE" #> <#@ assembly name ="System.Core.dll" #> <#@ assembly name ="System.Configuration" #> <#@ assembly name ="System.Xml" #> <#@ import namespace ="System.Collections.Generic" #> <#@ import namespace ="System.Configuration" #> <#@ import namespace ="EnvDTE" #> <#@ import namespace ="System.Xml" #> <#@ output extension =".
read morePosts
.NET 4.5 - Multicore JIT
以往我們的程式要增快啟動速度時,我們會使用 ngen 去產生原生映像檔,讓程式運行時改運行預先編譯過的原生映像檔,以減少 JIT 編譯的耗費。
然而 ngen 這種改善方案只適用於某些情境下,像是有安裝包的部署。並不是所有的情境都可以套用 ngen 這種改善方案。故在 .Net Framework 4.5 出現了 Multicore JIT 的概念,以並行編譯的方式來提升程式的啟動速度,預期可加速約 20% - 50% 。
微軟官方也有提供一些比較數據可供參考。
{% img /images/posts/MultiCoreJIT/1.png %}
{% img /images/posts/MultiCoreJIT/2.png %}
Multicore JIT 的運作原理主要是將運行分為兩種 Mode。一個是 Recording mode,於程式第一次運行時啟動,會將跟 Compile 要求的編譯紀錄到指定的 Profile 檔案。
{% img /images/posts/MultiCoreJIT/3.png %}
一個是 Plackback mode,會依照 Recording mode 所紀錄的 Profile 用另外一個 CPU 下去在背景編譯。
{% img /images/posts/MultiCoreJIT/4.png %}
以程式面來說,Asp.Net 4.5 與 Silverlight 5 這邊會自動啟用 Multicore JIT 功能,不需要做什麼特別的設定,如果有需要也可以修改 web.config 去將之關閉。
<system.web> <compilation profileGuidedOptimizations="None" /> </system.
read morePosts
Code Contracts - Contract Reference Assembly
在使用 Code Contracts 時,程式會加上很多驗證的程式,可能是前置條件、可能是後置條件、也有可能是些不變性的驗證,因此很多人對於程式效能上都有相當的疑慮。
但其實 Code Contracts 在使用上有很大的彈性,因為它底層是透過 CCRewrite 去將驗證的程式插入至正確的位置,所以它可以在專案屬性那邊將驗證檢查給直接抽掉。因此在 Release 時就可以只保留前置條件做參數的驗證,甚至是整個抽掉,這部分就比以往利用 if-throw 來驗證要來的有彈性,也不會有多餘的效能耗費。
雖然無效能耗費,但如果是開發 DLL ,那抽掉 Code Contracts 後 Release,使用該 DLL 的程式就無法享有 Code Contracts 所帶來的好處,這不是我們所樂見的。故 Code Contracts 提供了 Contract Reference Assembly 功能,在抽掉 Code Contracts 的同時,可將 Code Contracts 抽至另外ㄧ個獨立的組件,連同對應的設定提示也可一併帶到組件的 XML 中,別的組件在引用時就仍可享有 Code Contracts 所帶來的好處。
{% img /images/posts/ContractReferenceAssembly/1.png %}
這個功能在 .Net Framework 中就有被廣泛使用。可以看到 .Net Framework 這邊就有提供許多的 Contract Reference Assembly 。
{% img /images/posts/ContractReferenceAssembly/2.png %}
反組譯可以看到裡面只有存放 Code Contracts 的部分。
{% img /images/posts/ContractReferenceAssembly/3.png %}
read morePosts
ASP.NET - Config session timeout
ASP.Net Website 若未做任何的設定,預設的 Timeout 時間為 20 分鐘。有時我們需要對此做些調整,可能是設定短ㄧ點的值方便做些測試,或是系統本身就是需要設定不一樣的 Timeout 值。
若有調整的需要,可開啟 Web.config , 在 system.web element 內加入 sessionState tag ,並指定 timeout 的值。像是下面這樣:
<configuration> <system.web> <sessionState mode="InProc" cookieless="true" timeout="1" /> </system.web> </configuration> timeout 值的設定以分鐘為單位,最大上限值為 525,600 分鐘 (1 年) 。
Link sessionState 項目 (ASP.NET 設定結構描述)
read morePosts
SQL Server - Change Collation
要變更 Database Collation ,可以透過 GUI 開啟 Database Property 去調整 Collation 欄位值。
在調整之前必需先將 Restrict Access 欄位值為 SINGLE_USER,不然會無法切換 Collation。
{% img /images/posts/ChangeSqlCollation/1.png %}
透過 GUI 設定是比較簡易,但是資料庫一多就不怎麼適用,這時可以用 SQL 語法來做處理,開啟一個新的 Query ,填入下列語法,修改 Collation name,接著依序針對不同的資料庫下去執行就可以了。
declare @dbname varchar (100) set @dbname= quotename(db_name ()) set @collationName = 'SQL_Latin1_General_CP1_CI_AS' exec('ALTER DATABASE ' + @dbname + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'); exec('ALTER DATABASE ' + @dbname + ' COLLATE ' + @collationName); exec('ALTER DATABASE ' + @dbname + ' SET MULTI_USER'); 變更 Column 的 Collation 比較麻煩一點,雖然一樣可以用 GUI 去做切換,但欄位一多這方法也不怎麼適用。這時一樣得改用 SQL 語法來做處理,開啟一個新的 Query ,填入下列語法 ,修改 Collation name 後運行,即會自動產生出所有資料表內的 Column Collation 轉換語法,將之依序帶入 SQL Query 視窗運行即可。這邊比較麻煩的是若有設定PK、FK之類的,需先抽掉才能轉換。
read morePosts
Mefx - MEF Composition Analysis Tool
Mefx 是一用來分析與診斷 MEF 錯誤的命令列工具。當 MEF 在運作上不如預期時,我們可藉由此工具下去做些查驗。
程式主檔可至 Managed Extensibility Framework - Download: MEF Analysis Tool (mefx) for .NET 4.0 Beta 這邊下載。
{% img /images/posts/Mefx/1.png %}
命令列的使用語法如下:
mefx [files and directories] [action] [options] 使用時首先要帶入 /file 或是 /dir 參數,並指定要進行分析的檔案或目錄。
mefx /file:MyAddIn.dll /directory:Program\AddIns [action...] 接著視需要加入其它參數。像是在後面帶入 /parts 參數用以查閱組件內內含哪些可以使用的 part。
mefx /file:MyAddIn.dll /parts 帶入 /type 查閱特定的 part。
mefx /file:MyAddIn.dll /type:MyAddIn.AddIn 或是帶入 /imports 查閱 import 點。
mefx /file:MyAddIn.dll /imports 帶入 /exports 查閱 export 點。
mefx /file:MyAddIn.dll /exports 帶入 /verbose 顯示更為詳細的資訊。
read morePosts
WCF - Test WCF service with WCF Test Client
WCF Test Client 是ㄧ用來測試 WCF 的工具。使用時只要透過上方的功能選單。
{% img /images/posts/WCFTestClient/1.png %}
或是透過左側節點的滑鼠右鍵功能選單去觸發 ‘Add Service…’ 功能。
{% img /images/posts/WCFTestClient/2.png %}
將欲測試的 WCF Service 位置加入…
{% img /images/posts/WCFTestClient/3.png %}
{% img /images/posts/WCFTestClient/4.png %}
加入後左側的樹會展出該 Service 的節點,下方會有該 Service 可提供叫用的功能。
{% img /images/posts/WCFTestClient/5.png %}
在左側的樹這邊找到想要測試的功能,點擊切換。
{% img /images/posts/WCFTestClient/6.png %}
可以看到右側這邊會有該功能的輸入參數可供設定。
輸入參數設定完後,按下 Invoke 按鈕發送 Request。
{% img /images/posts/WCFTestClient/7.png %}
即可取得對應的 Response。
{% img /images/posts/WCFTestClient/8.png %}
{% img /images/posts/WCFTestClient/9.png %}
read morePosts
WPF - Refresh / Update WPF controls
相信大家都知道若要釋放些資源去讓畫面得以更新,若不將運算處理切離主執行緒,我們可能會偷懶用 DoEvents 來做。然而, DoEvents 這個方法的功用只是釋放資源,而釋放出的資源為誰所用,這部分我們無法掌控。因此釋放出的資源可能會被拿去做不相干的處理,造成效能嚴重低落。
在 WinForm 的世界裡,這樣的問題比較好處理,因為有許多現成的方法可以指定特定元件去做更新,像是 Update、Refresh、或是 Invalidate。
在 WPF 的世界裡,我們沒現有的方法可以直接叫用,只能用些小技巧兜出類似的功能。像是將下面這段擴充方法加入…
public static class ExtensionMethods { private static Action EmptyDelegate = delegate() { }; public static void Refresh(this UIElement uiElement) { uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate); } } 程式在撰寫時就可以像下面這樣直接透過 UI 元件觸發更新。
control.Refresh(); Link Refresh / Update WPF controls
read morePosts
Check if run as administrator
要判斷當前使用者是否具有管理者權限,我們可以先取得當前使用的 WindowsIdenty。
var wi = WindowsIdentity.GetCurrent(); 接著帶入剛取得的 WindowsIdenty,建立對應的 WindowsPrinciple。
var wp = new WindowsPrincipal(wi); 透過 WindowsPrinciple 的 IsInRole 方法判斷當前的使用者是否為 WindowsBuiltInRole.Administrator。
var isAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator); 所以整個程式會像下面這樣 :
private bool IsRunAsAdministrator() { var wi = WindowsIdentity.GetCurrent(); var wp = new WindowsPrincipal(wi); return wp.IsInRole(WindowsBuiltInRole.Administrator); } Link AntsCode: Running a ClickOnce Application as Administrator
read morePosts
SQLCop - Auditing Database for Best Practices
SQLCop 是專門為 SQL Server 量身打造的分析工具。能針對現有的 SQL Server 進行分析,會從資料庫的 Stored Procedure、 Schema、Table View、 Index 等不同面向下去分析,看看是否有改善的空間。
使用前請先連至 Less Than Dot - SqlCop 這邊,將程式下載並安裝…
{% img /images/posts/SQLCop/1.png %}
安裝完成將 SQLCop 程式開啟,選取要分析的SQL Server與資料庫,帶入帳密並按下 ‘Connect’ 按鈕,讓 SQLCop 與 SQL Server 資料庫進行連線。
{% img /images/posts/SQLCop/2.png %}
連線完成會看到下面這樣的畫面。
{% img /images/posts/SQLCop/3.png %}
SQLCop 會將偵測到的問題依型態與檢查的規則下去用階層分類,將之展開後可看到下面會列出我們違法規則的地方。若這邊不懂到底是哪裡有問題,可在規則節點上進行點擊,SQLCop 會帶出對應的說明。
{% img /images/posts/SQLCop/4.png %}
Link Less Than Dot - SqlCop SQL Cop Review
read more