2009-03-17 27 views

cevap

97
Boolean isDebugMode = false; 
#if DEBUG 
isDebugMode = true; 
#endif 

Eğer böyle yapmak gerekir yapýlar debug ve serbest bırakılması arasında farklı davranış programlamak isterseniz: Eğer fonksiyonların ayıklama sürümleri belli kontrolleri yapmak istiyorsanız

#if DEBUG 
    int[] data = new int[] {1, 2, 3, 4}; 
#else 
    int[] data = GetInputData(); 
#endif 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 

Yoksa yapabileceğini böyle:

public int Sum(int[] data) 
{ 
    Debug.Assert(data.Length > 0); 
    int sum = data[0]; 
    for (int i= 1; i < data.Length; i++) 
    { 
    sum += data[i]; 
    } 
    return sum; 
} 

Debug.Assert sürüm oluşturma dahil edilmeyecektir.

+0

JIT Optimize sürüm hakkında soran OP mı? Eğer öyleyse, bu cevap yanlış. Hata Ayıklama özniteliği bir JIT Optimize edilmiş yapısında veya optimize edilmemiş olarak bildirilebilir. –

11

Bunun sizin için yararlı umut:

public static bool IsRelease(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if ((d.DebuggingFlags & DebuggableAttribute.DebuggingModes.Default) == DebuggableAttribute.DebuggingModes.None) 
     return true; 

    return false; 
} 

public static bool IsDebug(Assembly assembly) { 
    object[] attributes = assembly.GetCustomAttributes(typeof(DebuggableAttribute), true); 
    if (attributes == null || attributes.Length == 0) 
     return true; 

    var d = (DebuggableAttribute)attributes[0]; 
    if (d.IsJITTrackingEnabled) return true; 
    return false; 
} 
+4

neden her iki işlev de bu satıra sahiptir: (attributes == null || attributes.Length == 0) true; Bu kodda bir sorun var. Yanıtı, bayrağı almak için gerçek bir yol yerine gerçek bir programatik yol sağladığından +1 yaptım. bazen bir wer'i wer'i bir derleyici bayrağı yerine kodun kendisinin bir parçası olarak ifade edilen hata ayıklama modunda bilmeye ihtiyaç duyuyor. –

+1

Sürüm modunda derlerseniz ve "none" dışındaki bir öğeye DebugOutput öğesini seçerseniz, DebuggableAttribute var demektir. Yani, bu cevap doğru değil. JIT Optimizasyon bayrağını bile aramadı. Hem manüel hem de programatik olarak farkı nasıl anlatacağımı yazara gönderme - http://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html –

+2

I Genel olayda bunun zorluklarına karşı @DaveB'i ertele. Bununla birlikte, sorunuz çok genişti ve eğer kodunuzu test ederken farklı davranmak istiyorsanız, bu testi yararlı buluyorum (VB.Net'de) 'System.Diagnostics.Debugger.IsAttached Sonra DoSomething '(Bir Formun Farklı Olması gibi) –