code-prettify

顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2014年8月5日 星期二

C# StyleCop 忽略特定檔案名稱

忽略特定檔案名稱

今天遇到一個問題,編譯檔案後進行 StyleCop 檢查時出現:
TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs(1,1)
TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs(1,1)
TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs(1,1)

看起來是自動產生的檔案,但是卻會造成 StyleCop 檢查失敗,
這時候可以手動加上 StyleCop 忽略檔案規則。

到 StyleCop 安裝目錄底下 (預設安裝路徑是 C:\Program Files (x86)\StyleCop 4.7),
使用文字編輯器開啟 Settings.StyleCop 檔案。

檔案內容預設如下:

<StyleCopSettings Version="4.3">
  <GlobalSettings>
    <CollectionProperty Name="DeprecatedWords">
      <Value>preprocessor,pre-processor</Value>
      <Value>shortlived,short-lived</Value>
    </CollectionProperty>
  </GlobalSettings>
  <Parsers>
    <Parser ParserId="StyleCop.CSharp.CsParser">
      <ParserSettings>
        <CollectionProperty Name="GeneratedFileFilters">
          <Value>\.g\.cs$</Value>
          <Value>\.generated\.cs$</Value>
          <Value>\.g\.i\.cs$</Value>
        </CollectionProperty>
      </ParserSettings>
    </Parser>
  </Parsers>
  <Analyzers>
    <Analyzer AnalyzerId="StyleCop.CSharp.NamingRules">
      <AnalyzerSettings>
        <CollectionProperty Name="Hungarian">
          <Value>as</Value>
          <Value>do</Value>
          <Value>id</Value>
          <Value>if</Value>
          <Value>in</Value>
          <Value>is</Value>
          <Value>my</Value>
          <Value>no</Value>
          <Value>on</Value>
          <Value>to</Value>
          <Value>ui</Value>
        </CollectionProperty>
      </AnalyzerSettings>
    </Analyzer>
  </Analyzers>
</StyleCopSettings>

找到其中一段 CollectionProperty ,預設已經有三行設定,
新增一行,如下:

          <Value>\.g\.cs$</Value>
          <Value>\.generated\.cs$</Value>
          <Value>\.g\.i\.cs$</Value>
          <Value>TemporaryGeneratedFile_.*\.cs$</Value>

存檔後,重新編譯一次專案,OK,沒有錯誤訊息了。


補充,如果想要忽略 *.pb.cs 這樣的規則,
加入下列這一行:

          <Value>\.pb\.cs$</Value>


Reference
TemporaryGeneratedFile_[guid] in /obj/debug breaking build

2014年7月25日 星期五

C# StyleCop System using directives must be placed before all other using directives.

一般我們的專案會像這樣,使用了很多的 using 參考。
這時候我們就會使用 Visual Stdio 內建的功能,對 Using 進行整理。
右鍵 > 組合管理 Using > 移除和排序


移除和排序後的樣子,很方便對吧!

 但是呢?StyleCop 出來抱怨了,
「System using directives must be placed before all other using directives.」。
也就是說,所有 System 相關的 using 必須放在最前面。


從前面的圖片可以看的出來,SocketLibaray 比 System 的字母順序還前面,所以排在 System 的前面了。
這樣我們就不能用 Visual Stdio 內建的排序了嗎?只能手動調整了嗎?
放心,其實 Visual Stdio 是有這個設定的,在功能選單內,
選項 > 文字編輯器 > C# > 進階 > 組合管理 Using > 排序 Using 時先放置 'System' 指示詞
將這個選項打勾,然後按下確定。



接著再對剛剛的 using 做一次排序,
噹噹!依照我們希望的順序,System 在前面了喔!
這麼一來 StyleCop 也不會報錯了呢。

C# StyleCop 忽略特定錯誤訊息

雖然 StyleCop 蠻方便的,但是有時候難免會出現誤報,
像是這一行 IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
ipHostInfo 就被判定為匈牙利命名法 (Hungarian notation),
這時候只能換另一個變數命名,
或者,使用 Suppress 忽略掉這個錯誤訊息。

在這個函式上方加上這一行
[SuppressMessage("StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Reviewed.")]
就可以忽略掉這一個錯誤訊息。

至於每一次 StyleCop Rule 的 Suppress 要怎麼寫,
可以參考 StyleCop Rules Documentation ,
除了 Rule Suppressions 的說明之外,每個 Rule 最下方也有該 Rule 的Suppress 方法。
像是這次遇到的 SA1305 FieldNamesMustNotUseHungarianNotation 就是從這裡來的。

Reference
StyleCop
StyleCop Rules Documentation


C# 程式碼風格分析 StyleCop 與 Visual Studio Express 整合


首先到 http://stylecop.codeplex.com/ 網站下載並安裝 StyleCop,
安裝過程就下一步按到底就完成了。
如果你使用的 Visual Studio 不是 Express 版本 (Professional, Premium, Ultimate...etc),
這時候在 Visual Studio > 方案總管 裡面對著專案按下右鍵,就會出現 Run StyleCop,
詳細的說明請參考這篇文章  [Tool]程式碼風格分析-StyleCop

因為 Visual Studio Express 不支援任何 UI 方面的擴充功能 (Extensions),
所以就算安裝完之後,是不會有任何變化的。
這時候可以手動在專案檔 (.csproj) 上設定,讓每一次建置 (Build) 的時候都執行一次 StyleCop 檢查。

在專案檔裡面加上這一行:
<Import Project="$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets" />

這麼一來,這個專案每次建置的時候,就會進行 StyleCop 檢查,錯誤訊息也會出現在 Visual Studio 的錯誤清單讓你檢視。當然,「檢示錯誤訊息」功能是不存在的,只能用錯誤代號自行查詢了。

延伸問題:
一、每個專案都要手動加上設定。
這點可以用靠修改範本讓新建立的專案都先加上設定,舊的就只能一個一個改。

二、如果這個專案在另一個沒有安裝 StyleCop 的電腦上建置,那專案就會建置失敗。
雖然可以透過 NuGet 安裝 StyleCop 來解決這個問題,但是考慮到 StyleCop Rule 的一致性,還是建議統一安裝 StyleCop。

Reference
StyleCop
Intergrating StyleCop with Visual Studio Express
[Tool]程式碼風格分析-StyleCop

2014年7月21日 星期一

C# Serialization

C# Serialzation

使用 C# 序列化物件

最近常遇到將物件序列化的問題,
想說乾脆將物件序列化的方法寫成一個工具,稱為 SerialzationHelper,
套上泛型就可以適用在所有的物件了。(當然該物件必須是 serializable 的才可以啦)

Book 是用來測試的可序列化類別,
Main 是使用序列化的過程,
SerialzationHelper 是序列化工具。

完整範例: Reference:
Basic Serialization
BinaryFormatter 類別
MemoryStream 類別
using Statement (C# Reference)

2014年4月8日 星期二

Log2Console 使用 log4net 的設定

Log2Console

先看一下圖片,(更多圖片)



先承認令我非常心動的是右邊那樹狀圖,可以很清楚的針對 Logger 做訊息的過濾 (Filter)。解決了想看 Log,卻又不想被龐大資料量淹沒的窘境。
缺點是資料量過多時,等待過濾的處理速度還是有點慢的,可能要適時的按一下 Clear。

打開 Log2Contole 之後,點選上方的 Receivers 設定要接受哪些來源的 Log,
按下 Add 按鍵,選 UDP (IP v3 and v6),預設 UDP Port 是 7071,
右下角從貼心的顯示 log4net 的 config 設定喔,直接複製貼上就可以用啦!



提醒一下,因為訊息太多的話,切換 Fillter 的時候會很慢很慢,甚至有時候會當掉,所以如果有一些 Logger 確定是不需要的話,可以先在 config 直接 Fillter 掉喔。

另外,官方提供的 Log2Console 中文會亂碼,網路上有人提供修正版,請到參考資料的第二個連結裡面下載喔!

參考資料
Log2Console
https://log2console.codeplex.com/

log4net和log2console的配置
http://www.cnblogs.com/yao2yao4/archive/2013/06/06/3120355.html