Ответ 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 в обычный код С#.