日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

發布時間:2023/12/10 asp.net 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題的提出?

晚上翻著群里的聊天,發現一個有趣的問題:如何通過編碼方式來判斷一個dll或者exe為debug build還是release build?由于沒有太多的討論,所以我只好自己找點兒辦法,試圖解決這個問題,為夜生活帶點刺激。于是,便有了本文的探索和分析。

當然,為了充分的調動起大家的主意,省去不必要的google操作,我覺得有必要對Debug和Release兩種模式的異同進行一點提綱挈領式的分析,從而為接下來的解決方案打好基礎。

Debug & Release

我們應用Visual Studio對代碼文件進行F5操作(Build)時,實際是發生了一系列語法檢查、詞法檢查和編譯過程,通常情況下我們有兩種Build模式,這就是常說的Debug Build和Release Build。望文知意,Debug Build模式通常應用于開發時,便于調試反饋;而Release Build則應用于部署時,這是因為Release模式下,編譯器做了很多的優化操作(代碼冗余、循環優化等),省去了對調試信息的記錄。因此,兩種Build模式是各不相同的,我們對其二者進行一點總結如下:

  • Debug用于開發時,Release用于部署時。
  • Debug模式下,將產生pdb文件,用于保存狀態信息和調試信息;Release模式下,不產生調試信息,也沒有pdb文件。
  • Debug模式下,System.Diagnostics.Debug.Write(或WriteLine)可以向跟蹤窗口(Output)輸出跟蹤信息;而Release模式下,System.Diagnostics.Debug.WriteLine將被忽略。不過,可以考慮System.Diagnostics.Trace.Write,其人緣較好,對Debug和Release左右通吃,都可輸出調試信息。
  • Debug模式下,#define DEBUG將作為默認預定義常量,參與編譯過程;而在Release模式下,該預編譯將被省略。例如如果執行:
#if DEBUGConsole.WriteLine("Hi");#endif

在Debug模式下,Console.WriteLine(“Hi”)將參與編譯,而Release模式下,會忽略該語句的執行。不過,如果你手動添加

#define DEBUG

在兩種模式下,都會執行Console.WriteLine(“Hi”)的編譯。究其原因,是Visual Studio在默認情況下預定義了#define DEBUG,我們可以通過開關來設置:

關于預編譯指令可詳查《你必須知道的.NET》的相關章節。

解決方案

既然對Debug Build和Release Build有個基本的了解,那么也由此可以推斷我們解決開篇問題的依據。在.NET中以DebuggableAttribute來控制CLR如何處理模塊代碼規則,而屬性IsJITTrackingEnabled屬性來標識運行庫在代碼生成過程中是否跟蹤調試信息的標識,如果IsJITTrackingEnabled為true,表示運行庫跟蹤調試信息,可推斷為Debug Build模式;如果IsJITTrackingEnabled為false,表示運行庫沒有跟蹤調試信息,可推為Release Build模式。所以,解決的方案,最終著眼于對IsJITTrackingEnabled信息的獲取上,可想而知,最簡單的辦法莫過于神兵利器——反射。

那么,我們開始吧。

構建

首先我們創建一個AnyContext來承載通用的上下文服務,在這里主要包含的就是:

/// <summary> /// A common context /// </summary> /// <remarks> /// Anytao, http://www.anytao.com /// </remarks> public class AnyContext : IAnyObject {public static DebugMode GetDebugMode(string assemblyName){ } } 其中,DebugMode是一個簡單的枚舉: /// <summary> /// Debug mode type /// </summary> /// <remarks> /// Anytao, http://www.anytao.com /// </remarks> public enum DebugMode {Debug,Release }

可向而知,我們需要實現一個根據Assembly信息獲取DebuggrableAttribute的Helper類,既然是Helper類我們希望能夠兼顧各種情況,因此通過泛型方法是做好的選擇,具體實現如下:

/// <summary> /// Common helper /// </summary> /// <remarks> /// Anytao, http://www.anytao.com /// </remarks> public static class Utils {/// <summary>/// Get GetCustomAttribute/// </summary>/// <typeparam name="T">CustomAttribute Type</typeparam>/// <param name="provider"></param>/// <returns></returns>public static T GetCustomAttribute<T>(this ICustomAttributeProvider provider)where T : Attribute{var attributes = provider.GetCustomAttributes(typeof(T), false);return attributes.Length > 0 ? attributes[0] as T : default(T);} }

此處的GetCustomAttribute被實現為擴展方法,那么任何實現了ICustomAttributeProvider接口的類型,都可以通過其獲取CustomAttribute了,例如:Type、Assembly、Module、MethodInfo,都可以實現對GetCustomAttribute的調用。

接下來,GetDebugMode的邏輯就變得很簡單,我們傳入assembly路徑即可獲取DebuggrableAttribute,并由此推導IsJITTrackingEnabled的情況:

public static DebugMode GetDebugMode(string assemblyName) {if (string.IsNullOrEmpty(assemblyName)){throw new ArgumentNullException("assemblyName");}DebugMode ret = DebugMode.Debug;try{// Get assebly by nameAssembly ass = Assembly.LoadFile(assemblyName);// Get DebuggableAttribute infoDebuggableAttribute att = ass.GetCustomAttribute<DebuggableAttribute>();ret = att.IsJITTrackingEnabled ? DebugMode.Debug : DebugMode.Release;}catch (Exception){throw;}return ret; } 好了,這就是一個簡單的判斷邏輯,在AnyContext中包含了很多諸如此類的上下文定義,而GetDebugMode提供了本文開頭的解決方案。

測試

  • 新建兩個project,并分別以Debug模式和Release模式編譯,生成對應的exe(或dll):
    • debugass.exe
    • releaseass.exe
  • 新建TestProject,并對GetDebugMode進行測試如下:
[TestClass] public class AnyContextTest {[TestMethod]public void TestIsDebugOrRelease(){// Arrangestring ass1 = @"D:\debugass.exe";string ass2 = @"D:\releaseass.exe";// Act string mode1 = AnyContext.GetDebugMode(ass1).ToString();string mode2 = AnyContext.GetDebugMode(ass2).ToString();// AssetAssert.AreEqual(mode1, "Debug");Assert.AreEqual(mode2, "Release");} }

一切OK,你不妨試試。

注:本測試在.NET 2.0及其以上版本測試通過,如您有更多精力,可對其以下版本進行分析。

?

參考文獻:

  • ms-help://MS.MSDNQTR.v90.chs/fxref_mscorlib/html/9f109812-3c14-dcb2-9aff-e18e20dc33ff.htm
  • http://blogs.msdn.com/jb/archive/2006/06/14/631469.aspx??

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。