10

不幸的是,C# 不允许额外的用户定义语法。但我想知道是否有可能通过利用视觉工作室 onbuild-event 来超越这个限制。

假设我有一些语法糖可以很容易地翻译成实际的 C# 代码。如果我要在构建 C# 项目之前自动将包含此新语法的 cs 文档转换为有效的 cs 文档,那么该项目可以成功构建。总的来说,这就像我扩展了 C# 语言一样,因为我从一个包含非官方语法的无效 cs 文档开始,但它还是编译了。

我意识到这有一些问题,例如这种翻译是永久性的。这也许可以通过恢复原始cs来规避(应该在调试结束后恢复,否则会丢失一些IDE功能)。但这些都是次要问题。

请让我知道你对这个想法的看法。这可能吗,如果可以,有人可以指导我参考一些有用的教程来实现这一点吗?具体来说,就是挖掘-a-onbuild-event。我搜索了 MSDN,但主题(http://msdn.microsoft.com/en-us/library/hthab0h8.aspx)对我没有帮助。

4

3 回答 3

11

我不会说这是否是一个好主意,因为我对你想要做的事情知之甚少。不过,我建议这样做:您建议的是在构建过程中将某种“扩展 C#”源代码文件转换为常规 cs。

就个人而言,我首先要摆脱“扩展” C# 语言的想法来澄清这一点。相反,我会将其视为定义一种恰好在语法上类似于 C# 的新语言(我假设)。使用不同的文件扩展名,以便 Visual Studio 不会尝试将您的语言编译为 C#。(也许是 .csx?人们喜欢添加字母 x,对吧?)

Visual Studio 已经以其他可能不那么明显的方式完成了这类事情。如果将资源文件添加到项目中,Visual Studio 通常还会包含一个动态生成的“designer.cs”,其中包含基于 .resx 文件内容生成的代码。如果查看 .resx 文件的属性,您会注意到“自定义工具”属性的值为“ResXFileCodeGenerator”。理论上,您应该能够实现自己的生成器来执行您提到的翻译步骤。其实这个翻译不一定是你说的一次性的。翻译过程应生成一个新文件,但保持原始文件不变。对原始文件的任何更改都会导致 Visual Studio 重新生成自动生成的文件。

I've not tried to implement a custom generator myself, but I think these articles are relevant: Implementing Single File Generators, and Registering Single File Generators

Your .csproj file would contain something such as the following:

<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>

Where Example.csx is the source code file containing your extended syntax and Example.cs is the resulting output of translating Example.csx into normal C# code.

于 2010-10-20T20:37:30.983 回答
3

What you are talking about doing seems like a perfect task for T4 templates in Visual Studio.

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

You can define anything you'd like; text files with a certain format, UML models, a database; and your T4 template can transform it into code in what ever way you wish.

于 2010-10-20T20:45:46.650 回答
2

我不确定这是一个好主意,但我只是有个主意:也许你可以看看Extending Visual Studio,下载 SDK 并查看文档。也许有可能做你想要达到的目标。

于 2010-10-20T20:21:16.707 回答