Posts
Auto assign assembly's build/revision number
在做軟體開發時,總是會碰到遞增產品版號的需求,通常這種時候我們會撰寫 Script 在建置之前對 Assembly.vs 檔內的版本資訊進行修改,以達到像這樣的需求。
然而有些時後我們只是想要讓建置的版號跟前次建立的有所區隔,不一定要將版號遞增的話,其實不需要到撰寫 Script 這樣麻煩,只要透過 Visual Studio 內建的機制就可以做到了。
將 Assembly.vs 檔開啟,視需求將 AssemblyVersion 的 Build 或 Revision Number 部份用 * 替換。並將 AssemblyFileVersion 設定移除。
{% img /images/posts/AutoAssignAssemblyVersion/1.png %}
接著存檔建置,即會發現每次建置的版號會有所不同。
Build 的部份會是當前本地時間與 2000 年 1 月 1 日之間所差天數,Revision 部分為與本地午夜所差的秒數除以 2。
Link AssemblyVersionAttribute 建構函式 (System.Reflection) Auto-Incrementing Build Numbers in Visual Studio.NET c# - Can I automatically increment the file build version when using Visual Studio? - Stack Overflow
read morePosts
ReSharper - Heap Allocation Viewer Extension
Heap Allocation Viewer 是 Reshaper 的擴充套件,能將 Heap 相關的操作 (像是 Local object allocation、Boxing、Delegate creation、Closure creation ) 進行 Highlight。
使用前需先開啟 ReSharper 的 Extension Manager。
{% img /images/posts/HeapAllocationViewer/1.png %}
搜尋框輸入 heapview 關鍵字,下載並安裝 Heap Allocation Viewer 套件 (若搜尋不到,可能是因為 ReSharper 太舊,需更新為 8.1 以後的版本)。
{% img /images/posts/HeapAllocationViewer/2.png %}
{% img /images/posts/HeapAllocationViewer/3.png %}
{% img /images/posts/HeapAllocationViewer/4.png %}
安裝好後,Visual Studio 即會將 Heap 相關的操作 Highlight。
{% img /images/posts/HeapAllocationViewer/5.png %}
{% img /images/posts/HeapAllocationViewer/6.png %}
以筆者來說,加裝該套件的主要原因是它可以幫我們 Highlight 程式中 Boxing 問題,而且在開發時當 Boxing 問題發生可以很容易的意識到。
read morePosts
Visual Studio 14 CTP 2 - Save and Apply Custom IDE Layouts
Save and Apply Custom IDE Layouts 是 Visual Studio 14 所釋出的新功能,能讓開發人員儲存並套用 IDE 的版面配置。藉此開發人員可依不同的開發情境或是需求下去設置適合的版面配置。像是要專注於程式碼的撰寫時,我們可以配置一個以程式碼編輯區為主較不被打擾的版面配置;要撰寫單元測試,可配置一個嵌有測試結果視窗的版面配置。
使用上只要將 IDE 的版面配置好,接著點擊 [Window/Save Window Layout] 主選單選項將當前的版面配置儲存。
{% img /images/posts/VS14SaveAndApplyLayout/1.png %}
{% img /images/posts/VS14SaveAndApplyLayout/2.png %}
{% img /images/posts/VS14SaveAndApplyLayout/3.png %}
當需要時可透過點擊 [Window/Apply Window Layout] 主選單選項,或是透過觸發熱鍵 Ctrl + Alt +1~9 快速的進行版面配置的切換。
{% img /images/posts/VS14SaveAndApplyLayout/4.png %}
這邊的 Layout 擺放順序跟儲存的順序有關,若有需要隨時可透過點擊 [Window/Manage Window Layouts] 主選單選項,將 Manage Window Layouts 視窗叫出來調整。
{% img /images/posts/VS14SaveAndApplyLayout/5.png %}
{% img /images/posts/VS14SaveAndApplyLayout/6.png %}
read morePosts
C# 6.0 - Exception filters
Exception filters 是預計要在 C# 6.0 釋出的新功能,目前已可在 Visual Studio 14 中透過設定將功能開啟進行體驗,只要在方案檔中加上:
<LangVersion>experimental</LangVersion> 或是透過 .Net Fiddle 也可以,Compiler 那邊選取 Roslyn 就可以了。
Exception filters 能讓開發人員很容易的在攔截例外時順帶做些過濾的動作,藉此處理符合過濾條件的例外,且不對例外呼叫堆疊造成不良的影響。
以往我們必須要先將例外攔截,接著進行比對過濾,最後將符合的例外做對應的處理,不符合的例外繼續讓它向外擴出。但是這樣的作法會讓例外呼叫堆疊看不到實際發生的例外點,只看到重新擴出例外的點,造成除錯上的困難。
{% img /images/posts/ExceptionFilters/1.png %}
Exception filters 的出現能幫助開發人員解決這樣的問題。
它的語法很直覺,簡單來說就只是在 Try/Catch 的 Catch 後面加上 if 條件式進行過濾。
try {...} catch(Exception e) if (...) {...} 程式寫起來會像下面這樣:
反組譯看一下,可以看到 Exception filters 這邊會被編譯成 filter 區塊的部份,從 IL 這邊就直接支援。
{% img /images/posts/ExceptionFilters/2.png %}
這樣的寫法不僅直覺,且不會對例外呼叫堆疊造成不良的影響。
{% img /images/posts/ExceptionFilters/3.png %}
最後這邊做個新舊方法的測試比較:
可以看到效能的部份其實是差不多的,新語法感覺是沒有任何的效能優化。
read morePosts
Visual Studio - Use 64 Bit IISExpress
雖然 .Net 程式支援位元適應性,Visual Studio 也允許我們做 64 位元的網站開發,但 Visual Studio 預設啟用的 IISExpress 是 32位元的。
{% img /images/posts/x64IISExpress/1.png %}
所以當在做 64 位元的網站開發時,在本地端測試我們會發現網站會跑不起來,因為 64 位元的網站無法跑在 32 位元的 IISExpress 上。
這時要馬要改用 IIS 去跑,要馬就是要像像下面這樣輸入命令修改登錄檔,將 Visual Studio 設定為使用 64 位元的 IISExpress:
reg add HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\WebProjects /v Use64BitIISExpress /t REG_DWORD /d 1 注意到這邊,登錄檔位置依 Visual Studio 版本不同會有所差異,可參閱 Microsoft Visual Studio - Wikipedia, the free encyclopedia 內的 Internal version 部分下去調整。
{% img /images/posts/x64IISExpress/2.png %}
設定完後重起 Visual Studio,再次運行跑起來的就會是 64 位元的 IIS Express。
read morePosts
T4MVC - Add Timestamp To Static Links
T4MVC 除了解決 ASP.NET MVC Magic String 的問題外,還能解決常見的網頁 Cache 問題。
只要在 T4MVC.tt.settings.xml 設定檔中將 AddTimestampToStaticLinks 設為 True 就可以了。
... <AddTimestampToStaticLinks>True</AddTimestampToStaticLinks> ... 這樣使用 T4MVC 去取用靜態檔案的位置時,T4MVC 就會幫我們在網址後面依照檔案的修改時間去附加雜湊值,避免前端快取。
read morePosts
T4MVC - Generate a single file with everything
T4MVC 預設在產生程式碼時會依 Controller 產生不同的檔案,這樣會在專案目錄下產生很多的檔案,然而以自動產出的檔案來說,只要產生無誤,功能都正常,那麼產生的程式是不是照 Controller 分開,說實話一點都不重要。
且以現階段來說,T4MVC 無法脫離 Visual Studio 運行,因此 CI Server 無法運行 T4MVC 去產生檔案,這樣的設定使得每新增一個檔案就必需記得 Commit 對應的產出檔到版控上,反而造成不便。
好在 T4MVC 有留這部份的設定彈性,我們只要在 T4MVC.tt.settings.xml 設定檔中將 SplitIntoMultipleFiles 設為 False 即可。
... <!-- If true,the template output will be split into multiple files. --> <SplitIntoMultipleFiles>false</SplitIntoMultipleFiles> ...
read morePosts
C# 6.0 - Using static members
Using static members 是預計要在 C# 6.0 釋出的新功能,目前已可在 Visual Studio 14 中透過設定將功能開啟進行體驗,只要在方案檔中加上:
<LangVersion>experimental</LangVersion> 或是透過 .Net Fiddle 也可以,Compiler 那邊選取 Roslyn 就可以了。
Using static members 能讓開發人員更方便的對指定類別的靜態成員做存取。對於程式中有大量的靜態成員存取操作時特別好用。
使用上與 Namespace 的 Using 類似,只是後面帶的不是到 Namespace 而已,而是進一步再向下帶到 Class。用 Using 指定要存取的類別後,在程式中就可以直接存取該類別的靜態成員,就如同自身的成員一般。
以一個較完整的例子來看,程式寫起來會像下面這樣:
可以看到這邊程式的一開始就先使用 Using 引用 Console 類別,後續我們就可以在程式中直接存取 Console 類別的靜態成員,像是取用 Title 、或是呼叫 WriteLine 方法。
反組譯看一下,可以發現其實該語法也只是編譯器幫我們在編譯時做了些處理。
{% img /images/posts/UsingStaticMembers/1.png %}
read morePosts
C# 6.0 - Auto-property initializers
Auto-property initializers 是預計要在 C# 6.0 釋出的新功能,目前已可在 Visual Studio 14 中透過設定將功能開啟進行體驗,只要在方案檔中加上:
<LangVersion>experimental</LangVersion> 或是透過 .Net Fiddle 也可以,Compiler 那邊選取 Roslyn 就可以了。
Auto-property initializers 能讓開發人員在宣告 Auto-property 的同時就順道做初始的動作。不用另行在建構子中設定。也不再寫用回一般的 Property 寫法,然後在 Field 宣告時設定。
它的語法很直覺,簡單來說就是本來的 Auto-property 後面直接接上賦值的語法。像是:
public string Property { get; set; } = "Value"; 除了一般可讀可寫的 Property 外,唯讀的甚至是靜態的 Property 該語法也都支援。
以一個較完整的例子來看,程式寫起來會像下面這樣:
程式寫起來可以看到比以往精簡許多,運行後屬性也都有正確的賦值。
反組譯看一下,可以看到比較接近透過變數初始器去做賦值的動作,會在基底類別初始前宣告,也會標注 beforefieldinit。
{% img /images/posts/AutoPropertyInitializers/1.png %}
{% img /images/posts/AutoPropertyInitializers/2.png %}
read morePosts
T4MVC - A T4 template for ASP.NET MVC
玩過 ASP.Net MVC 的應該都有注意到,在寫 ASP.Net MVC 時會用到很多 Magic String。像是在取網址位置時,會需要帶入 Controller Name 以及 Action Name。
@Url.Action("Home", "Index") 在設定連結時,會需要帶入連結名稱、 Controller Name 以及 Action Name。
@Html.ActionLink("Home", "Index", "Home") 導到另外一個 Action 去處理時,又需要 Action Name。
return RedirectToAction("About"); 可以看到這些叫用帶入的都是字串,而且類似的地方還有很多,所以整個 ASP.Net MVC 寫下來會發現 Magic String 充斥在程式中。這樣的問題不僅讓我們開發上無 Intellisense 可用,編寫時不是那麼便利,修改時也容易因此而有所遺漏。
這篇要介紹的 T4MVC 就是一能解決這樣問題的 T4 範本套件。 T4MVC 透過 T4 去遍巡專案內的檔案,產生一些輔助的類別與方法的多載,巧妙的避開 Magic String 的問題。這邊可先快速的瀏覽一下 Channel 9 的相關影片,體驗一下 T4MVC 的魅力。
使用前需先透過 NuGet 搜尋並安裝 T4MVC 套件。
{% img /images/posts/T4MVC/1.png %}
{% img /images/posts/T4MVC/2.png %}
read more