本文主要闡述一些Visual Studio開發下需要知道的少部分且比較實用的功能,也是很多人忽略的部分。一些不常用而且冷門的功能不在本文范圍,當然本文的尾巴【.Net必知系列】純屬意淫,如有雷同,基情四射。。
- WEB項目版本發布時 Web.config 中 Web.Release.config 和 Web.Debug.config 的使用。
- 項目屬性下【生成事件】使用。
- 快速分析未知架構和類調用結構的方式(VS2010/2012)。
有時候我們開發與發布Web應用程序時Web.Config中的配置可能不一樣,比如數據庫連接字符串。那在發布時想自動替換Web.config文件的內容如何辦呢?特別是項目開發到后期配置節點越來越多,共同部分和差異部分經常使用<!--注釋--> 來進行節點的切換,這樣是不是覺得太麻煩了,現在我們就來解決這個問題,當然這只是演示比較常用的一種方式,至於其他方式不做言表。
大家看見的這個就是所說的3個經常看見但是下面2個一般沒有人使用額配置文件, Web.Release/Debug.config內容描敘(默認新建項目會自動生成)
下面是Web.Release.config 和 Web.Debug.config 的配置文件
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 --> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!-- In the example below, the "SetAttributes" transform will change the value of "connectionString" to use "ReleaseSQLServer" only when the "Match" locator finds an attribute "name" that has a value of "MyDB". --> <connectionStrings> <add name="AppConnection" connectionString="這里填寫【測試環境連接字符串】或【正式環境的字符串】分別寫在Release.config,Debug.config中" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> </configuration>
下面是Web.config 的配置文件
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <connectionStrings> <add name="AppConnection" connectionString="默認連接字符串"/> <add name="TestCommon" connectionString="公共使用的連接字符串"/> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
注意,我在Web.config的connectionStrings節點下 下建立2個 子節點用來比較發布后的效果,當發布后就會變成
下面是發布 后Web.config 的配置文件
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <connectionStrings>//注意這里的字符串變了,變成了release配置文件中的字符串 <add name="AppConnection" connectionString="發布環境連接字符串"/> <add name="TestCommon" connectionString="公共使用的連接字符串"/> </connectionStrings> <system.web> <compilation targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
這樣就自動把替換Web.config中需要替換的節點按照設定的模式進行處理了,下面具體看一下描敘語言吧。
這里面2句重要的語句是 xdt:Transform="SetAttributes" xdt:Locator="Match(name)" 這2個配置屬性意思是,把Web.config中connectionStrings對應name為AppConnection的節點屬性替換。
這里的語法來源於xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" 命名空間,那2個分開的文件中都需要導入才能使用。
簡單講一下常用配置屬性
1 :locator屬性
(1)Match;
這里你需要就是在你直接匹配的屬性名。
<connectionStrings> <add name="Northwind" connectionString="connection string detail" providerName="System.Data.SqlClient" xdt:Transform="Replace" xdt:Locator="Match(name)" /> </connectionStrings>
Engine會再你的Web.config中找到匹配name為Norhwind的就用上面的配置文件圖替換。
(2)Condition 基於XPath,在Locator中應用有邏輯性的判斷表達式。
<connectionStrings> <add name="Northwind" connectionString="connection string detail" providerName="System.Data.SqlClient" xdt:Transform="Replace" xdt:Locator="Condition(@name=’Northwind or @providerName=' System.Data.SqlClient')" /> </connectionStrings>
上面就是Name屬性匹配‘Norhwind’的或providerName匹配System.Data.SqlClient的配置文件節點都會被替換。
2: Transform 屬性
(1) Replace 表示所有匹配的節點都是替換
<assemblies xdt:Transform="Replace"> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> </assemblies>
其實這里描述文件時web.release.config,將要替換的文件時Web.config . (2) Remove 刪除第一匹配的元素。
<assemblies xdt:Transform="Remove"> </assemblies>
(2)RemoveAll
<connectionStrings> <add xdt:Transform="RemoveAll"/> </connectionStrings>
(3)Insert
插入從父節點中插入,(authorization中插入<deny users="*" />)
<authorization> <deny users="*" xdt:Transform="Insert"/> </authorization>
(4)SetAttributes
<compilation batch="false" xdt:Transform="SetAttributes(batch)"> </compilation>
本功能和技巧大概就這里,具體詳細的配置參考下面微軟官方文檔
https://msdn.microsoft.com/zh-cn/library/dd465326(v=vs.100).aspx
什么是生成事件呢,可以使用生成事件指定在生成開始之前或生成完成之后運行的命令。只有當生成成功到達生成過程中的這些時間點時,才執行生成事件。淺顯易懂的說就是項目編譯完畢后,你需要額外做些什么事情,這個在C#代碼里面是做不了的,這樣生成事件就派上用場了。

看到這個圖是不是很熟悉呢,但具體用到過的同學有多少^_^。
生成事件分為【生成前】和【生成后】執行的命令函數,后期生成事件又可以指定

3種編譯情況選項
常見生成事件舉例:生成后DLL復制,轉移
例子一:

我有一個解決方案【NetToolStudio】這個是我一個插件式項目,由於【NTS.SqlServer】該程序集只是一個插件實現的子集,所以不依賴主框架,不會自動復制到BIN目錄,更不會幫我復制到【DBProvider】放置插件文件夾,故需要將NTS.SqlServer生成的dll拷貝到【DBProvider】目錄。但是每次手動拷貝很麻煩,於是乎生成事件就派上用場了,生成事件里的命令行是支持dos命令的,在后期生成事件命令行中輸入 “copy或xcopy [源文件全路徑] 拷貝到的路徑”。
xcopy /r /y $(TargetPath) $(SolutionDir)NTS\DBProvider\
這樣就產生了這樣一句dos命令

當然也可以想如圖上的寫多條命令語句。
大家看見里面有$(TargetPath) $(SolutionDir)這些是些什么啊?打開生成事件中的宏如下圖所示。

看打了吧,這樣我們可以拿到程序集和解決方案給我的一些宏命令,至於什么是宏命令,這里不做解釋,可以使用就好。
本功能大概就這里,具體詳細的配置參考下面微軟官方文檔
https://msdn.microsoft.com/zh-cn/library/ke5z92ks(v=vs.100).aspx
分享幾個好用的批處理,也是常用喲。
查找當前執行目錄的文件並復制.rar 【該批處理的功能可以把當前目錄所有的DLL復制到當前的TEMP文件夾中】
DeleteBin.rar 【看名字就知道是刪除所有VS生成的BIN目錄和OBJ目錄,打包時復制帶走的好幫手】
大家有時候看開源代碼和新入職一家公司看以前同仁寫的代碼是不是很糾結,沒有文檔,沒有架構圖,沒有人問,但是項目已經維護了N年了,看起來好惡心啊,現在有2種VS自帶的功能來快速瀏覽和建立起自己的邏輯思維圖。

是的,就是我們在代碼編輯窗體中右鍵后出現的,這2種代碼視圖和調用層次結構圖是快速讀懂別人代碼的一種捷徑。
1.VS 2010引進了一個新的“View Call Hierarchy (查看調用的層次結構)”的特性,允許你快速地發現你的代碼庫中的某個特定方法或屬性是在何處被調用的,允許你快速地遍歷(traverse)整個代碼庫的調用樹形圖(而不必運行或調試方案)。
2.上面的代碼視圖,微軟叫做【Code Map 理解復雜代碼】
首先來看看【查看調用的層次結構】
方法名稱上右鍵后點擊-》查看調用的層次結構,稍等幾秒就會出現如下圖

然后點擊里面的【UpdateKeyWordToFile】節點,可以繼續展開。

看是不是很爽,具體怎么看,請看紅色標識,趕緊去嘗試一下吧,具體還有很多功能,有很多驚喜。
再來看看代碼(類)引用圖【Code Map 理解復雜代碼】
【類】或者【方法】名稱上右鍵后點擊-》在代碼上查找所有引用,稍等幾秒(看機器性能)就會出現如下圖:
右鍵方法

右鍵類

如果大家覺得它僅僅只是看看而已就錯了,當我們debug的時候也能顯示當先調用方法的具體位置和層次,能看清前后的調用順序。
當我打了斷點后,右圖也會顯示一個斷點圖標,標識運行的具體位置,如果你的index里面有很多方法,都可以右鍵添加到右邊的MAP視圖中,根據自己的喜好來調整數量和層次。

具體如何操作趕緊親自體驗一下吧,本來想寫詳細點的教程的,但是發現看視頻可能更快,提供一個微軟的官方視頻:
本次的一些VS需要知道的功能和技巧就寫到這里,下次如果有好的繼續分享。
