2008-10-11 12 views
42

Mam zainstalowaną aplikację na moim komputerze. Jak mogę się dowiedzieć, czy został skompilowany w trybie DEBUG, czy nie?Jak sprawdzić, czy aplikacja .NET została skompilowana w trybie DEBUG lub RELEASE?

Próbowałem użyć .NET Reflector, ale nie pokazuje nic konkretnego. Oto, co widzę:

// 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

podobieństw pytania w Stackoverflow, jedno pytanie, i wiele, wiele różnych odpowiedzi: http: // stackoverflow.com/questions/654450/programowo wykrywający-release-debug-mode-net http://stackoverflow.com/questions/798971/how-to-idenfiy-if-the-dll-is-debug-or-release -build-in-net http://stackoverflow.com/questions/194616/how-to-tell-if-net-app-was-compiled-in-debug- lub-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- release-build-vs-debug-build – Kiquenet

Odpowiedz

29

I blogged to dawno temu, a ja nie wiem, czy to nadal aktualne, czy nie, ale kod jest coś takiego jak ...

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

Wygląda na to, że działa; choć wydaje się raczej kruchy. –

+0

Tak jak powiedziałem, kilka lat temu, kiedy przeprowadziłem dochodzenie ... Kto wie, co zmieniło się w ramach, a nawet, jak źle pracowałem pierwotnie. ;) – ZombieSheep

+0

Wspaniały kod! Stworzyłem aplikację konsolową zintegrowaną z moją maszyną do kompilacji, aby sprawdzić, czy końcowa aplikacja do dostarczenia nie będzie w trybie debugowania. – Samuel

9

Właściwie jesteś na właściwej drodze. Jeśli spojrzeć w oknie Disassembler w reflektorze widać następującą linię jeśli została ona zbudowana w trybie debugowania:

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

Nieprawda; Właśnie sprawdziłem zestaw, który zbudowałem w trybie Release. To jeszcze tę cechę: [montaż: Debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] –

+3

Skompilowałem trybie zwolnienia i to zaobserwować Reflektor [montażu: Debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] – chikak

+5

Kiedy rozmontowania montaż w trybie debugowania, widzę to: [montażu: Debuggable (DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)] Kiedy budować go w tryb wyzwalania migawki, atrybut debuggable ma tylko flagę IgnoreSymbolStoreSequencePoints, o czym wszyscy wspomnieliście. – Alric

2

Jak na temat korzystania IsDebug narzędzia Jeff klucz jest? Jest trochę przestarzały, ale ponieważ masz Reflectora, możesz go dekompilować i przekompilować w dowolnej wersji frameworka. Zrobiłem.

+1

+1, ale nie ma potrzeby dekompilowania narzędzia - autor udostępnia kod źródłowy: http://www.sliver.com/Downloads/IsDebugSource.zip –

23

Odpowiedź ZombieSheep jest niepoprawna.

Moja odpowiedź na to duplikat pytanie jest tutaj: How to tell if a .NET application was compiled in DEBUG or RELEASE mode?

Bądź bardzo ostrożny - po prostu patrząc na „zespołu atrybutów” w manifeście Assembly na obecność atrybutu „Debuggable” ma NIE znaczy, że mieć zespół, który nie jest zoptymalizowany JIT. Zestaw może być zoptymalizowany JIT, ale wyjście zespołu w obszarze ustawień kompilacji zaawansowanej powinno zawierać informacje "pełne" lub "tylko pdb" - w takim przypadku atrybut "debuggable" będzie obecny.

Proszę odnieść się do moich postów poniżej, aby uzyskać więcej informacji: How to Tell if an Assembly is Debug or Release i How to identify if the DLL is Debug or Release build (in .NET)

Jeff Klucz aplikacji nie działa poprawnie, ponieważ identyfikuje „Debug” budować w oparciu o DebuggableAttribute jeśli jest obecny. Wartość DebuggableAttribute jest obecna, jeśli kompilujesz w trybie Release i wybierzesz DebugOoutput na coś innego niż "none".

Należy również określić exaclty, co należy rozumieć przez „Debug” vs. „uwolnienie” ...

  • Czy oznacza to, że aplikacja jest skonfigurowana z optymalizacją kodu?
  • Masz na myśli to, że możesz dołączyć do niego Debugger Visual Studio/JIT?
  • Czy masz na myśli, że generuje DebugOutput?
  • Czy masz na myśli to, że definiuje stałą DEBUG? Pamiętaj, że możesz warunkowo kompilować metody za pomocą atrybutu System.Diagnostics.Conditional().
+0

Dzięki za szczegółowe wyjaśnienie różnych aspektów i typów "kompilacji debugowania". Będę pewny, aby skierować ludzi do Twojego bloga, gdy następnym razem zobaczę pewne nieporęczne implementacje. – ulty4life

2

Oto wersja VB.Net rozwiązania proponowane przez ZombieSheep

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 
Powiązane problemy