У меня есть небольшая программа на C#, которая производит разные выходные данные между версиями Debug и Release. Пустой вывод из версии Release, я думаю, соответствует спецификации языка C#. Эта программа не должна выводить результат, но версия Debug.Различные выходные C# между выпуском и отладкой
Я запустил обе версии Release и Debug из командной строки (вне среды VS) и получил тот же непоследовательный вывод. Я декомпилировал версию Debug (используя ILDASM), а затем повторно скомпилировал ее с помощью ILASM. Когда я это делаю, новая скомпилированная программа ведет себя точно так же, как версия Release. Я могу только представить себе, что когда я декомпилирую, а затем повторно компилирую что-то, меня оставляют без внимания, но я не смог определить, что изменилось.
Что касается размера EXE-файла: обе версии выпуска и отладки, выпущенные VS, имеют одинаковый размер файла: 5,120 байт. Когда я декомпилирую и повторно компилирую, обе версии снова имеют одинаковый, но меньший размер файла: 3,072.
Программа довольно маленькая, и я посмотрел на IL в Reflector, и я не вижу ничего, что могло бы вызвать разницу в выходе.
У кого-нибудь есть (надеюсь, подробное) объяснение, почему именно существует разница?
Обратите внимание, что я не , пытаясь, чтобы сделать версии отладки и выпуска неизменными, обязательно, я хочу понять, почему они не являются.
Вспомните, что я сказал выше - обе версии отладки и выпуска производят другой выход , даже если они запускаются из командной строки. Если вы скажете мне, что среда выполнения делает какую-то оптимизацию для версии Release, но не для версии Debug, то в сборках версии Debug/Release должно быть что-то, что говорит, что среда выполнения включает в себя/выключает оптимизацию. Что такое встроенное «что-то» и почему оно не переносится при использовании ILDASM/ILASM?
Вот код:
using System;
class Test {
static int value = 0;
static int a = Initialize("Assigning a");
static int b = Initialize("Assigning b");
static String name = "Fred";
static int c = Initialize("Assigning c");
static int Initialize(String mssg) {
++value;
Console.WriteLine("In Initialize() :: {0}, name={1}, returning {2}", mssg, name, value);
return value;
} // Initialize()
static void Main() {
} // Main()
} // class Test
А вот выход из Visual Studio создается версия Debug:
In Initialize() :: Assigning a, name=, returning 1
In Initialize() :: Assigning b, name=, returning 2
In Initialize() :: Assigning c, name=Fred, returning 3
Запуск версии выпуска не генерирует никакого вывода.
Скорее всего, в режиме деблокирования тестовый класс не загружен, так как нет ссылки на него. Попробуйте добавить 'Console.WriteLine (Test.name);' к вашему основному методу. – EZI
Я бы порекомендовал поставить 'Console.WriteLine (« In Main »);' показать, что main на самом деле вызывает вызов. (Я просто попробовал, что вы все равно получаете другой результат, однако, если вы делаете больше, например 'Console.WriteLine (« In Main() :: {0} », name);', то отлаживайте и отпускайте начало, ведущее себя так же) –
paging mr skeet, mr skeet, пожалуйста, зайдите на страницу SO – pm100