Идея расширения синтаксиса C # - PullRequest
10 голосов
/ 21 октября 2010

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 21 октября 2010

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

Лично я бы пояснил это сначалаотказ от идеи, что вы «расширяете» язык C #;Вместо этого я бы подумал, что это определение нового языка, который синтаксически похож на C # (я полагаю).Используйте другое расширение файла, чтобы Visual Studio не пыталась скомпилировать ваш язык как C #.(Может быть .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 - исходный кодфайл, содержащий расширенный синтаксис и пример .cs, является результатом преобразования файла Example.csx в обычный код C #.

3 голосов
/ 21 октября 2010

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

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

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

2 голосов
/ 21 октября 2010

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

...