扩展C#语法的想法

时间:2010-10-20 20:05:40

标签: c# visual-studio vs-extensibility

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

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

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

请让我知道你对这个想法的看法。这是可能的,如果是这样,有人可以指导我一些有用的教程,以实现这一目标吗?特别是点击进入建筑事件。 我搜索过MSDN,但主题(http://msdn.microsoft.com/en-us/library/hthab0h8.aspx)对我没有帮助。

3 个答案:

答案 0 :(得分:10)

我不会说这是不是一个好主意,因为我不太了解你想要做什么。不过我建议这样做:你提出的建议是使用某种“扩展C#”源代码文件,在构建过程中将其转换为常规cs。

就个人而言,我首先要忽略你正在“扩展”C#语言的想法;我会把它想象为定义一种恰好在语法上类似于C#的新语言(我假设)。使用不同的文件扩展名,以便Visual Studio不会尝试将您的语言编译为C#。 (也许.csx?人们喜欢添加字母x,对吗?)

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

我自己没有尝试过自定义生成器,但我认为这些文章是相关的:Implementing Single File GeneratorsRegistering Single File Generators

您的.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是将Example.csx转换为普通C#代码的结果输出。

答案 1 :(得分:3)

您正在谈论的内容对于Visual Studio中的T4模板来说似乎是一个完美的任务。

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

你可以定义任何你想要的东西;具有特定格式的文本文件,UML模型,数据库;并且您的T4模板可以按照您希望的方式将其转换为代码。

答案 2 :(得分:2)

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