2008-10-11 14 views
42

Bilgisayarımda yüklü bir uygulama var. DEBUG modunda derlenmiş olup olmadığını nasıl anlarım?Bir .NET uygulamasının DEBUG veya RELEASE modunda derlenip aktarılmadığını nasıl anlarsınız?

.NET Reflector'u kullanmayı denedim, ancak belirli bir şey göstermiyor. İşte bakın şudur: ...

// Assembly APPLICATION_NAME, Version 8.0.0.15072 
Location: C:\APPLICATION_FOLDER\APPLICATION_NAME.exe 
Name: APPLICATION_NAME, Version=8.0.0.15072, Culture=neutral, PublicKeyToken=null 
Type: Windows Application 
+0

benzerleri sorular, bir soru ve birçok, birçok farklı cevaplar önerdiği çözümün VB.Net sürümüdür.com/questions/654450/programatik algılama-bırakma-hata ayıklama modu-net http://stackoverflow.com/questions/798971/how-to-idenfiy-if-the-dll-is-debug-or-release -be-in-ağ-içi http://stackoverflow.com/questions/194616/how-to-tell-if-net-app-was-compiled-in-debug-or-release-mode http://stackoverflow.com/questions/50900/best-way-to-detect-a-release-build-from-a-debug-build-net http://stackoverflow.com/questions/890459/asp-net- Sürüm-build-vs-debug-build – Kiquenet

cevap

29

Ben blogged bu uzun zaman önce ve hala geçerli ya da değil, ama kod gibi bir şey olup olmadığını bilmiyorum

private void testfile(string file) 
{ 
    if(isAssemblyDebugBuild(file)) 
    { 
     MessageBox.Show(String.Format("{0} seems to be a debug build",file)); 
    } 
    else 
    { 
     MessageBox.Show(String.Format("{0} seems to be a release build",file)); 
    } 
}  

private bool isAssemblyDebugBuild(string filename) 
{ 
    return isAssemblyDebugBuild(System.Reflection.Assembly.LoadFile(filename));  
}  

private bool isAssemblyDebugBuild(System.Reflection.Assembly assemb) 
{ 
    bool retVal = false; 
    foreach(object att in assemb.GetCustomAttributes(false)) 
    { 
     if(att.GetType() == System.Type.GetType("System.Diagnostics.DebuggableAttribute")) 
     { 
      retVal = ((System.Diagnostics.DebuggableAttribute)att).IsJITTrackingEnabled; 
     } 
    } 
    return retVal; 
} 
+0

Bu işe yarar; Ancak oldukça kırılgan görünüyor. –

+0

Dediğim gibi, birkaç yıl önce araştırma işini yaptığım zaman ... Çerçevede neyin değiştiğini, hatta aslında yaptığım işin ne kadar kötü olduğunu kim bilebilir? ;) – ZombieSheep

+0

Harika kod! Teslim edilecek son uygulamanın hata ayıklama modunda olmayacağını doğrulamak için yapı makinemde tümleşik bir konsol uygulaması oluşturdum. – Samuel

9

Aslında doğru yoldasın.

[assembly: Debuggable(...)] 
+7

Doğru değil; Release modunda oluşturduğum bir montajı kontrol ettim. Hala bu özelliği vardı: [montaj: debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] –

+3

sürümü modunda derlenmiş ve ben reflektör odasında gördüm: [montaj: debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] – chikak

+5

Ben sökerken bir : Hata ayıklama Modu montaj, ben bunu görmek [montaj: debuggable (DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)] ben Yayın Mode bunu oluştururken, Hata ayıklanabilir özniteliğin tümü, söz ettiğiniz gibi yalnızca IgnoreSymbolStoreSequencePoints işaretine sahiptir. – Alric

2

Nasıl Jeff Key'in IsDebug programını kullanma hakkında: Eğer reflektör içinde Disassembler penceresinde bakarsanız hata ayıklama modunda inşa edilmiş eğer aşağıdaki satırı görecek? Biraz tarihli, ancak Reflektörünüz olduğundan, onu yeniden oluşturabilir ve çerçevenin herhangi bir sürümünde yeniden derleyebilirsiniz. Yaptım.

+1

+1, ancak yardımcı programı derlemenize gerek yoktur - yazar kaynak kodunu sağlar: http://www.sliver.com/Downloads/IsDebugSource.zip –

23

ZombieSheep'in yanıtı yanlış.

bu yinelenen soruya cevabım buradadır: How to tell if a .NET application was compiled in DEBUG or RELEASE mode?

çok dikkatli olun - sadece sen misin DEĞİL demek 'debuggable' özelliği varlığı için Meclis Manifest'te 'niteliklerini montaj' bakıyor JIT optimize edilmemiş bir montaj var. Derleme, JIT'i optimize edilmiş olabilir, ancak 'Tam' veya 'sadece pdb' bilgisini içerecek şekilde ayarlanmış Gelişmiş Yapı ayarları altında Montaj Çıktısı olabilir - bu durumda 'Hata Ayıklama' özelliği mevcut olacaktır.

fazla bilgi için aşağıda benim mesajların bakınız: o DebuggableAttribute varsa dayalı bir "Debug" yapı tanımlayan nedeniyle How to Tell if an Assembly is Debug or Release ve How to identify if the DLL is Debug or Release build (in .NET)

Jeff Key'in uygulama, düzgün çalışmıyor. Yayınlama modunda derlerseniz ve "none" dışındaki bir öğeye DebugOutput'ı seçerseniz, DebuggableAttribute mevcut.

Ayrıca "Debug" e karşı "Yayın" ile ne kastedildiğini exaclty ... tanımlamanız gerekir

  • uygulamanın kod optimizasyonu ile yapılandırıldığını ifade ediyor mu?
  • Visual Studio/JIT Debugger'ı buna ekleyebileceğiniz anlamına mı geliyor?
  • Bu, DebugOutput ürettiği anlamına mı geliyor?
  • Bu, DEBUG sabitini tanımladığını mı kastediyorsunuz? Koşulları, System.Diagnostics.Conditional() özniteliği ile yöntemleri derleyebileceğinizi unutmayın. http: // stackoverflow
+0

Farklı açılardan ve türlerden ayrıntılı açıklama sağladığınız için teşekkürler "debug" oluşturur. Bazı iffy uygulamalarını gördüğümde insanları blog'unuza yönlendireceğinden emin olacağım. – ulty4life

2

İşte ZombieSheep

Stackoverflow içinde
Public Shared Function IsDebug(Assem As [Assembly]) As Boolean 
    For Each attrib In Assem.GetCustomAttributes(False) 
     If TypeOf attrib Is System.Diagnostics.DebuggableAttribute Then 
      Return DirectCast(attrib, System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled 
     End If 
    Next 

    Return False 
End Function 

Public Shared Function IsThisAssemblyDebug() As Boolean 
    Return IsDebug([Assembly].GetCallingAssembly) 
End Function 
İlgili konular