Как определить, является ли DLL Debug или Release build (в.NET)
Возможный дубликат:
Как определить, скомпилировано ли приложение.NET в режиме DEBUG или RELEASE?
Я уверен, что об этом уже спрашивали, но поиск в Google и SO не помог мне.
Как я могу определить, является ли DLL сборкой релиза или сборкой отладки?
2 ответа
Единственный лучший способ сделать это - проверить сами скомпилированные сборки. Rotem Bloom нашел здесь очень полезный инструмент под названием "Информация о сборке.NET". После того, как вы установите это, он ассоциируется с файлами.dll, чтобы открыть сам с собой. После установки вы можете просто дважды щелкнуть по сборке, чтобы открыть ее, и она предоставит вам детали сборки, как показано на скриншотах ниже. Там вы можете определить, скомпилирован он или нет.
Надеюсь это поможет..
ИМХО, вышеприведенное приложение действительно вводит в заблуждение; он только ищет IsJITTrackingEnabled, который полностью не зависит от того, скомпилирован ли код для оптимизации и JIT Optimization.
Атрибут DebuggableAttribute присутствует, если вы компилируете в режиме Release и выбираете DebugOutput для чего-либо, кроме "none".
Вы также должны точно определить , что подразумевается под "Отладка" против "Выпуск"...
Вы имеете в виду, что приложение настроено с оптимизацией кода? Вы имеете в виду, что вы можете подключить к нему отладчик VS/JIT? Вы имеете в виду, что он генерирует DebugOutput? Вы имеете в виду, что он определяет константу DEBUG? Помните, что вы можете условно компилировать методы с помощью атрибута System.Diagnostics.Conditional().
ИМХО, когда кто-то спрашивает, является ли сборка "Отладка" или "Выпуск", они действительно имеют в виду, оптимизирован ли код...
Ооо, вы хотите сделать это вручную или программно?
Вручную: необходимо просмотреть значение битовой маски DebuggableAttribute для метаданных сборки. Вот как это сделать:
- Откройте сборку в ILDASM
- Откройте Манифест
- Посмотрите на битовую маску DebuggableAttribute. Если атрибут DebuggableAttribute отсутствует, это определенно оптимизированная сборка.
- Если он присутствует, посмотрите на 4-й байт - если это '0', то он оптимизирован JIT - что-нибудь еще, это не так:
// Версия метаданных: v4.0.30319.... //.custom instance void [mscorlib] System.Diagnostics.DebuggableAttribute::. Ctor (valuetype [mscorlib] System.Diagnostics.DebuggableAttribute / DebuggingModes) = (01 00 02 00 00 00 00 00)
Программно: при условии, что вы хотите программно узнать, является ли код JIT Optimized, вот правильная реализация:
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's 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";
}
Я представил эту реализацию в своем блоге по адресу: