Идея для расширения синтаксиса С#

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

Предположим, у меня есть синтаксический сахар, который можно легко перевести в реальный код С#. Если бы я автоматически переводил документ cs, содержащий этот новый синтаксис, в действительный документ cs, непосредственно перед созданием С# -проекта, проект мог бы успешно сработать. В целом это будет работать так, как если бы я расширил язык С#, потому что я начал с недопустимого документа cs, содержащего необоснованный синтаксис, но он все равно скомпилирован.

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

Пожалуйста, дайте мне знать, что вы думаете об этой идее. Возможно ли это, и если да, может ли кто-нибудь направить меня к некоторым полезным учебникам, чтобы достичь этого? В конкретном событии "постукивание в-на-строить". Я искал MSDN, но тема (http://msdn.microsoft.com/en-us/library/hthab0h8.aspx) не помогла мне.

Ответ 1

Я не буду говорить, это хорошая идея или нет, потому что я недостаточно знаю о том, что вы пытаетесь сделать. Я бы предложил это, хотя: то, что вы предлагаете, это иметь какой-то "расширенный С#" исходный код, который переводится в обычные cs во время процесса сборки.

Лично я прояснил бы это, сначала отрываясь от идеи, что вы "расширяете" язык С#; Вместо этого я бы подумал об этом как о создании нового языка, который, по-видимому, синтаксически похож на С# (я предполагаю). Используйте другое расширение файла, чтобы Visual Studio не пыталась скомпилировать ваш язык как С#. (Может быть .csx? Людям нравится добавлять букву x, правильно?)

Visual Studio уже делает подобные вещи другими способами, которые могут быть не столь очевидными. Если вы добавите файл ресурса в проект, Visual Studio, как правило, также будет включать динамически созданный "designer.cs" с кодом, сгенерированным на основе содержимого вашего файла .resx. Если вы посмотрите на свойства файла .resx, вы заметите, что свойство "Custom Tool" имеет значение "ResXFileCodeGenerator". Теоретически вы должны иметь возможность реализовать свой собственный генератор для выполнения упомянутого вами этапа перевода. На самом деле, этот перевод не обязательно должен быть разовым, как вы сказали. Процесс перевода должен сгенерировать новый файл, но оставить исходный файл неповрежденным. Любые изменения исходного файла заставляют Visual Studio регенерировать автоматически сгенерированный файл.

Я не пытался самостоятельно реализовать собственный генератор, но я думаю, что эти статьи актуальны: Реализация генераторов одиночных файлов и Регистрация генераторов одиночных файлов

В файле .csproj будет содержаться следующее:

<Content Include="Example.csx">
  <Generator>ExtendedCSharpCodeGenerator</Generator>
  <LastGenOutput>Example.cs</LastGenOutput>
</Content>
<Compile Include="Example.cs">
  <AutoGen>True</AutoGen>
  <DesignTime>True</DesignTime>
  <DependentUpon>Example.csx</DependentUpon>
</Compile>

Где Example.csx - это файл исходного кода, содержащий расширенный синтаксис, а Example.cs - результат вывода перевода примера .csx в обычный код С#.

Ответ 2

То, о чем вы говорите, кажется идеальной задачей для шаблонов T4 в Visual Studio.

http://msdn.microsoft.com/en-us/library/bb126445.aspx

Вы можете определить все, что захотите; текстовые файлы с определенным форматом, UML-модели, базу данных; и ваш шаблон T4 может превратить его в код, каким бы вы ни хотели.

Ответ 3

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