Pull to refresh

Comments 34

Данный вопрос можно решить использованием класса CSharpCodeProvider. Но мы копнем глубже и создадим WEB Forms приложение без использования Visual Studio. Нашим основным инструментом станет csc.exe.

Странно, мне казалось, что как раз CSharpCodeProvider «глубже», чем csc.exe. Что такого вам надо от командной строки, что вы не можете сделать с помощью кода?

Что важнее, в каком реальном применении вам нужно делать именно описанное (т.е., на лету генерить сайт на веб-формах)? Почему нельзя обойтись более «прозрачными» решениями?
На самом деле нет — CSharpCodeProvider является оберткой над csc.exe, а не наоборот.
Да, действительно. Спасибо.
Статья обращена скорее к новичкам в .NET. Здесь я хотел показать делающим первые шаги программистам как происходит построение проекта. Так сказать добиться понимания «низкоуровневых» механизмов, это как раз и подразумевалось под словом «глубже». Строить сайт, сборку или приложение с применением командной строки и CSC не имеет смысла. Но повторюсь, статья носит скорее учебный характер.
Построение WEB Forms приложения выбрано опять же не случайно. У тех, кто только берется за их изучение иногда возникают проблемы с осмысление этого «зверя», Люди не всегда понимают, что веб-форма — это самый обычный класс со свойствами, событиями, методами и прочими прелестями. Надеюсь, у меня получилось это показать.
В ближайшее время постараюсь опубликовать статью о реальном применении динамического построения сборок, естественно с использованием более «прозрачных решений».
происходит построение проекта.

Не так, как у вас. Построение проекта происходит с помощью MSBuild, и там все существенно занятнее. Компиляция — только один из шагов.

Так сказать добиться понимания «низкоуровневых» механизмов, это как раз и подразумевалось под словом «глубже».

Тогда где объяснение того, что именно делает каждый параметр компилятора? Где объяснение файловой структуры? Где разбор вывода? А ваш батник, скажем, делает больше, чем только компиляция — это вы тоже нигде не описывате.

Построение WEB Forms приложения выбрано опять же не случайно. У тех, кто только берется за их изучение иногда возникают проблемы с осмысление этого «зверя», Люди не всегда понимают, что веб-форма — это самый обычный класс со свойствами, событиями, методами и прочими прелестями. Надеюсь, у меня получилось это показать.

Не получилось. Вы нигде об этом не пишете. Казалось бы, простой вопрос — почему класс MyPage помечен как partial?
1. Visual Studio генерирует файлы проекта формата MSBuild. Которые MSBuild и строит. Во введении русским по белому написано, что VS не используется. Проект VS не создается. Следовательно не создаются и файлы для MSBuild. MSBuild использует поднаборы инструментов, которые включают в себя CSC, VBC и т.д… В любом случае все построение проекта сводится к обращению к CSC. Поэтому это и есть «низкоуровневый» механизм.
Слово проект в контексте статьи используется для структуры примера, а не как проект VS.

2. Для объяснения каждого параметра компилятора существует MSDN, перепечатывать который не имеет смысла. А ознакомиться с ним желательно каждому.

3. Если читать внимательно, то можно увидеть такие слова «Мы объявляем класс страницы нашего приложения как WForms_ByHands.MyPage. Этот класс должен быть указан в атрибуте «Inherits» нашей формы. Этот класс будет загружен при обращении к нашей форме». Также приводится пример кода. В совокупности это дает представление о веб-форме как о классе. Особенно слова «класс страницы».

4. Ключевое слово partial говорит о том, что класс является разделяемым. Пояснять что это значить я думаю не нужно. А то, к чему Вы клоните опять-таки упирается в проект VS (см. пункт 1 комментария).
В любом случае все построение проекта сводится к обращению к CSC.

Нет. При сборке проекта запускается msbuild, который в том числе, но не только запускает CSC.

Для объяснения каждого параметра компилятора существует MSDN, перепечатывать который не имеет смысла.

Для того, чтобы научиться с ним работать, тоже достаточно MSDN.

Ключевое слово partial говорит о том, что класс является разделяемым.

И для чего это нужно в вашем примере?

Пояснять что это значить я думаю не нужно

Мне — не нужно. Но вы же не для меня пишете, вы пишете, по вашим же заверениям, для начинающих программистов. Вы думаете, им это пояснять не нужно?
Уважаемый, lair! Если Вам скучно и Вы хотите попридираться, то Вы не по адресу. Я бы хотел попросить Вас внимательно перечитать статью, Ваши собственные, а также мои комментарии и сделать соответствующие выводы. А я еще раз приведу основные тезисы нашей полемики.

1. MSBuild — платформа, применяемая для компиляции проекта Visual Studio, который в свою очередь имеет формат MSBuild. Проекта VS в статье нет (какой раз я это уже пишу?), а значит и MSBuild ничего не сможет построить. Под словом ПРОЕКТ подразумевается СТРУКТУРА КОНКРЕТНОГО ПРИМЕРА СТАТЬИ. Акцентирую на этом Ваше внимание. Подчеркиваю, что к ней НЕЛЬЗЯ применить MSBuild. Соль статьи — это построение работающего WEB Forms приложения без использования MS Visual Studio, то есть как можно построить работающее веб-приложение имея только компилятор csc, а также уточнение особенностей веб-форм. CSC служит для получения конечных сборок, приложений и т.п. на основе заданных параметров или ответного файла. Понимание этих механизмов необходимо любому программисту.

2. Спецификация языка в статье не приводится. MSDN в статье не приводится. Эти ресурсы каждый программист должен осваивать и использовать самостоятельно (даже начинающий). Перед тем, как начать создавать код желательно ознакомиться с основами используемого языка, то есть иметь базовую подготовку.

3. И специально для lair. Ключевое слово partial означает, что класс является разделяемым. То есть описание класса допускается расширять в любом месте кодового пространства(в другом файле, в этом же файле) с соблюдением правил синтаксиса языка C#. В данном примере я как автор имею право пометить мой класс словом partial. Правила синтаксиса не нарушены, фундамент для потенциального расширения функциональности заложен (уточню, что расширить функциональность по своему усмотрению может человек, который решит воспроизвести пример)

На этом считаю вопрос исчерпанным. Конструктивная критика приветствуется.
MSBuild — платформа, применяемая для компиляции проекта Visual Studio,

А вот и нет. MSBuild — это инструмент сборки ПО, формат проектов которого, в том числе, используется VS. Никто не мешает создать проект MSBuild, не используя студию.

Правила синтаксиса не нарушены, фундамент для потенциального расширения функциональности заложен (уточню, что расширить функциональность по своему усмотрению может человек, который решит воспроизвести пример)

YAGNI.
Показать вам ошибки в вашей статье. В первую очередь — методологические.
Большое спасибо за Ваши старания. Но Вы удаляете читателей статьи от ее темы. Вы невнимательно прочитали статью, отсюда Ваши неуместные ремарки по поводу MSBuild. Которым в статье не пахнет и пахнуть не могло по причине отсутствия в нем необходимости.
MSBuild — это система построения для Visual Studio. Не верите, прошу сюда. Лично я MSDN верю больше.

YAGNI. Я рад, что Вы знакомы с этим подходом к проектированию ПО. Но по моему мнению функциональность программного продукта и ключевое слово, необходимое компилятору — это немного разные вещи.

Я буду рад, если Вы мне укажите на методологические ошибки, чтобы впредь я их не воспроизводил. Но только если Вы сами перед этим осмыслите статью и свои комментарии, а также мои ответы на них.
Которым в статье не пахнет и пахнуть не могло по причине отсутствия в нем необходимости.

В csc в вашей статье тоже нет необходимости, однако вы его применяете.

ключевое слово, необходимое компилятору — это немного разные вещи.

partial не необходим компилятору в вашем примере.

Я буду рад, если Вы мне укажите на методологические ошибки, чтобы впредь я их не воспроизводил.

  • отсутствие практического применения (точнее, несоответствие заявленного практического применения методам в статье)
  • ненужное использование csc
  • необъясненная структура файлов
  • необъясненное содержимое батника
  • избыточный partial
Уважаемый, а давайте я сам буду решать о чем мне писать! Я написал о том, о чем хотел написать.

Статья учебная, поэтому возможно, что она не найдет практического применения, а возможно кому-то пригодится ее часть. Загуглите, люди встречаются с проблемой, которую я затронул.

Структура файлов не объяснена. Да. Она приводится в примере как факт. Но подчиняется хорошо известным договоренностям о разделении источников (source) и конечного продукта (build/deploy).

Батник. Цитирую "… Ответный файл может содержать все параметры компилятора и являться единственным параметром в командной строке для csc.exe...". Плюс комментарий в коде батника. Повторюсь еще и еще раз, я не намеревался переписывать MSDN и информацию о iisexpress. За меня это сделали и уже не один раз

Ваш любимый partial. Я уже писал на этот счет и повторяться не собираюсь.

Если Вам хочется, то Вы можете самостоятельно опубликовать статью о работе с MSBuild. Или показать в комментарии как пользоваться этим программным средством. Вам этого никто не запрещает. Хаброчитатели были бы благодарны увидеть замечания или информацию по проблеме, а не выковыривание чего-нибудь откуда-нибудь.
а давайте я сам буду решать о чем мне писать!

Сколько угодно. Равно как и я сам буду решать, что мне комментировать.

Она приводится в примере как факт. Но подчиняется хорошо известным договоренностям о разделении источников (source) и конечного продукта (build/deploy).

… и вас ни капли не смущает, что aspx-файл — это исходник, но лежит он у вас в deploy.
Сударь, с Вами все понятно. Сначала у Вас CSharpCodeProvider «глубже», чем csc.exe. Теперь ASPX-файл стал исходником. Уберите из имеющегося примера default.aspx и проверьте работоспособность, я думаю Вы будете удивлены.

Без дополнительной настройки IIS будет искать default.aspx. Извините, но это азы. Это пишется на первых страницах книг, посвященных веб-формам. ASPX грубо — это файл визуальной разметки. Тяжко без него придется программисту при развертывании приложения.

Специально для Вас нашел. Цитирую "...Web Forms are made up of two components: the visual portion (the ASPX file), and the code behind the form, which resides in a separate class file...." Источник

Скажите, пожалуйста, как все написанное вами противоречит тому, что .aspx — это исходник?
Судя по стилю Вашего общения мне наверное следует ответить, что default.aspx является как исходником, так и запрашиваемым файлом на сервере.

Как я должен обращаться к веб-форме, если в deploy не будет aspx? Напишите, пожалуйста, пример GET-запроса.
Похоже, вы действительно не понимаете, как это устроено.

Когда делается веб-приложение, создается файловая структура, содержащая как файлы разметки, файлы с кодом, конфигурационные файлы и много чего еще интересного. Это все — исходники.

Когда происходит сборка веб-приложения, код и ресурсы компилируются в сборку, которая попадает в целевую папку, а файлы, помеченные как content (в том числе — файлы разметки и конфигурация), просто копируются туда же (это я говорю про простую сборку, без кастомных скриптов и config transforms).

(именно за это, кстати, отвечает проект msbuild, содержащий все эти задачи)

Поэтому в вашей файловой структуре все, кроме deploy.bat и deploy.rsp, должно лежать в папке source, deploy.bat и deploy.rsp — в папке deploy, а результаты должны писаться в папку out. Это если говорить о «принятых договоренностях о разделении».

Но этот весь мрак вызван только и исключительно тем, что вы выбрали (а) веб-формы и (б) csc. Если бы вы взяли, скажем, asp.net mvc и собирали сборку на лету, можно было бы обойтись существенно меньшим количеством допущений.

(Ну и еще есть такие милые вещи как прекомпиляция aspx и virtual path providers, которые тоже несколько меняют роль aspx в процессе)

Если бы у бабушки были мужские первичные половые признаки, то она была бы дедушкой.

Вот если бы я выбрал mvc и msbuild. Тогда бы мы и вели эти разговоры. А по факту выбран csc и веб-формы c озвученными выше целями.

По использованию csc и по описанию класса веб-формы есть нарекания?
Есть, и они описаны выше.

Хотя, повторюсь, первая проблема в том, что надо выбирать инструмент под цели, а не наоборот.

PS Очень жаль, что вы не видите, что msbuild и mvc — это строго перпендикулярные направления развития в контексте задачи, и без обоих из них можно обойтись.
Напишите, пожалуйста своими словами мои цели.
Беда в том, что у вас их нет. «Давайте, я покажу, как компилировать файлы с помощью csc, только не понятно, зачем». Я же в первом комментарии об этом написал.
Зачем? Затем, что люди иногда задают такие вопросы. Загуглите и великий и ужасный покажет такого рода вопросы на форумах.

Если спрашивают, значит нужен ответ. Я постарался его дать. Если одному человеку что-то не нравится, что же это его право.
Какие именно вопросы?

Понимаете, зачастую конкретный вопрос — это всего лишь признак того, что человек заранее решил в голове задачу, и теперь ему, казалось бы, не хватает одного шага; но на самом деле, его решение неверно целиком.
Компиляция приложений и сборок при помощи csc
Найдите в гугле такие запросы и лично задайте вопрос тем людям.
Вот и возвращаемся к тому, о чем я сказал: вы предлагаете решение, но не понимаете задачу.

(при этом в предлагаемом вами решении тоже есть ошибки, но это нюансы)
Вы уже опросили людей? Можно ссылочку на то, что Вы нашли. Может мы о разном?
Я не вижу смысла идти в гугл, когда я решал такую задачу в своем опыте. Метапрограммирование — достаточно распространенная задача, про нее даже книжки пишут.

Поскольку вы не говорите, какую прикладную задачу вы решаете, я, очевидно, могу додумать любую. Вопрос про прикладную задачу был в первом комментарии.
Ответ тоже был — учебно-познавательная. Если Вы слышите только себя, то это исключительно Ваши проблемы. Наличие у Вас опыта не означает, что он есть с рождения у всех. Некоторым требуется помощь из вне.

Считаю беседу непродуктивной и не имеющей смысла. Это пустая трата времени. Участвовать дальше в ней не намерен. Готов продолжить общение в случае поступления интересных мыслей и предложений
И специально для Вас aspx. Там в табличке указано «application root or a subdirectory»

Мне кажется достаточный факт для того чтобы держать default.aspx в deploy
Уважаемый, lair! Если Вам скучно и Вы хотите попридираться, то Вы не по адресу. Я бы хотел попросить Вас внимательно перечитать статью, Ваши собственные, а также мои комментарии и сделать соответствующие выводы. А я еще раз приведу основные тезисы нашей полемики.

1. MSBuild — платформа, применяемая для компиляции проекта Visual Studio, который в свою очередь имеет формат MSBuild. Проекта VS в статье нет (какой раз я это уже пишу?), а значит и MSBuild ничего не сможет построить. Под словом ПРОЕКТ подразумевается СТРУКТУРА КОНКРЕТНОГО ПРИМЕРА СТАТЬИ. Акцентирую на этом Ваше внимание. Подчеркиваю, что к ней НЕЛЬЗЯ применить MSBuild. Соль статьи — это построение работающего WEB Forms приложения без использования MS Visual Studio, то есть как можно построить работающее веб-приложение имея только компилятор csc, а также уточнение особенностей веб-форм. CSC служит для получения конечных сборок, приложений и т.п. на основе заданных параметров или ответного файла. Понимание этих механизмов необходимо любому программисту.

2. Спецификация языка в статье не приводится. MSDN в статье не приводится. Эти ресурсы каждый программист должен осваивать и использовать самостоятельно (даже начинающий). Перед тем, как начать создавать код желательно ознакомиться с основами используемого языка, то есть иметь базовую подготовку.

3. И специально для lair. Ключевое слово partial означает, что класс является разделяемым. То есть описание класса допускается расширять в любом месте кодового пространства(в другом файле, в этом же файле) с соблюдением правил синтаксиса языка C#. В данном примере я как автор имею право пометить мой класс словом partial. Правила синтаксиса не нарушены, фундамент для потенциального расширения функциональности заложен (уточню, что расширить функциональность по своему усмотрению может человек, который решит воспроизвести пример)

На этом считаю вопрос исчерпанным. Конструктивная критика приветствуется.
Sign up to leave a comment.

Articles