Возможный дубликат:
Как узнать, скомпилировано ли приложение .NET в режиме DEBUG или RELEASE?
Я уверен, что это было задано раньше, но google и SO search мне не удалось.
Как определить, является ли DLL сборкой сборки или отладки?
Возможный дубликат:
Как узнать, скомпилировано ли приложение .NET в режиме DEBUG или RELEASE?
Я уверен, что это было задано раньше, но google и SO search мне не удалось.
Как определить, является ли DLL сборкой сборки или отладки?
Единственный лучший способ сделать это - проверить сами скомпилированные сборки. Существует очень полезный инструмент под названием "Информация сборки сборщика", найденный здесь от Rotem Bloom. После того, как вы установите это, он ассоциируется с файлами .dll, чтобы открыть их сам. После установки вы можете просто дважды щелкнуть мышью на сборке, чтобы открыть ее, и она даст вам детали сборки, как показано на скриншотах ниже. Там вы можете определить, отлаживает ли он скомпилирован или нет.
alt text http://ruchitsurati.net/myfiles/asm_info.jpg
alt text http://ruchitsurati.net/myfiles/release_assembly.PNG
LinkText: http://www.codeplex.com/AssemblyInformation
Надеюсь, что это поможет.
IMHO, вышеуказанное приложение действительно вводит в заблуждение; он ищет только IsJITTrackingEnabled, который полностью не зависит от того, компилирован ли код для оптимизации и оптимизации JIT.
Отладочный атрибут присутствует, если вы скомпилируете в режиме Release и выберите DebugOutput для чего-либо другого, кроме "none".
Вам также нужно точно определить, что подразумевается под "Debug" и "Release"...
Вы имеете в виду, что приложение настроено с оптимизацией кода? Вы имеете в виду, что вы можете присоединить к нему отладчик VS/JIT? Вы имеете в виду, что он генерирует DebugOutput? Вы имеете в виду, что он определяет константу DEBUG? Помните, что вы можете условно скомпилировать методы с атрибутом System.Diagnostics.Conditional().
IMHO, когда кто-то спрашивает, является ли сборка "Debug" или "Release", они действительно означают, что код оптимизирован...
Итак, вы хотите сделать это вручную или программно?
Вручную: Вам нужно просмотреть значение битовой маски DebuggableAttribute для метаданных сборки. Вот как это сделать:
//Версия метаданных: v4.0.30319....//.custom instance void [Mscorlib] System.Diagnostics.DebuggableAttribute::. Т е р (ValueType [mscorlib] System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00)
Программно: предполагая, что вы хотите знать программно, если код JITOptimized, вот правильная реализация:
object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute),
false);
// If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
if (attribs.Length > 0)
{
// Just because the 'DebuggableAttribute' is found doesn't necessarily mean
// it a DEBUG build; we have to check the JIT Optimization flag
// i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
if (debuggableAttribute != null)
{
HasDebuggableAttribute = true;
IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";
// check for Debug Output "full" or "pdb-only"
DebugOutput = (debuggableAttribute.DebuggingFlags &
DebuggableAttribute.DebuggingModes.Default) !=
DebuggableAttribute.DebuggingModes.None
? "Full" : "pdb-only";
}
}
else
{
IsJITOptimized = true;
BuildType = "Release";
}
Я представил эту реализацию в своем блоге по адресу: