Сборка выпуска .dll по-прежнему содержит код, который следует удалить с помощью директив препроцессора

#c# #debugging #release #preprocessor #compiler-directives

Вопрос:

У меня есть проект c# .net core, в котором используются директивы препроцессора ( #if DEBUG) для включения небезопасных SSL-соединений во время отладки. Теперь, когда я выпускаю-создаю весь проект и открываю сгенерированную dll с помощью dotPeek, я все еще нахожу код, окруженный «#if DEBUG». Я бы подумал, что этот код удаляется во время сборки. Я также проверил, что в настройках сборки из VS «определить ОТЛАДКУ» не установлен флажок для конфигурации сборки-выпуска. Является ли мое представление о том, как это работает, неверным ? Где в .dll я бы вообще нашел определение «ОТЛАДКА» — в верхней части файла или где-нибудь еще ?

 #if DEBUG
        DisableSecureSSLConnections();
#endif
 

Конфигурация сборки выпуска

Комментарии:

1. «…Я все еще нахожу код в окружении «#если ОТЛАДКА «там…» — доказательство?

2. Быстрый тест показывает, что на самом деле все работает так, как задумано. В зависимости от define этого код будет опущен.

3. dotPeek ищет фактический исходный код , если он доступен. Это не показывает вам состояние после компиляции.

4. » Я все еще нахожу код, окруженный «#если ОТЛАДКА» «, — IL не может представить #if : дизассемблер не может посмотреть на dll и восстановить #if . Так что Дотпик получает это откуда-то еще. Скорее всего, он нашел файл .pdb рядом с библиотекой DLL, и в файле .pdb есть путь к исходному коду, поэтому dotPeek любезно нашел ваш фактический исходный код и отображает его вам. Вы должны увидеть другие подсказки, такие как исходный код, который выглядит идентичным вашему фактическому коду, в комплекте с комментариями и значимыми именами локальных переменных

5. @canton7 большое спасибо — это была реальная проблема.

Ответ №1:

Как @canton7 упоминалось в разделе комментариев. Фактическая проблема заключалась в том, что файл .pdb был доступен для дизассемблера. Это заставило dotPeek показать фактический источник