假设我有一些语法糖,可以很容易地转换成实际的C#代码.
如果我自动将包含此新语法的cs文档翻译成有效的cs文档,就在构建C#-project之前,该项目可以成功构建.总体而言,这将像我扩展C#语言一样起作用,因为我启动了一个包含非法语法的无效的cs文档,但是它编译.
我意识到这有一些问题,比如这个翻译是永久的.这可能是通过恢复原始cs(应该在调试结束后恢复的,否则一些IDE功能将丢失)来规避.但这些是次要问题.
请让我知道你对这个想法的看法.这是可能的,如果是这样,有人可以指导我一些有用的教程,以达到这个目的?具体来说,tap-into-a-onbuild事件.
我搜索过MSDN,但主题(http://msdn.microsoft.com/en-us/library/hthab0h8.aspx)没有帮助我.
解决方法
就我个人而言,首先要从“扩展”C#语言的思想中脱颖而出,我认为它是定义一种恰好与C#语法相似的新语言(我假设).使用不同的文件扩展名,以便Visual Studio不会尝试将您的语言编译为C#. (也许.csx?人们喜欢添加字母x,对吗?)
Visual Studio已经以其他方式做了这样的事情,可能不太明显.如果将资源文件添加到项目中,Visual Studio通常还将包含动态生成的“designer.cs”,其中包含基于.resx文件内容生成的代码.如果您查看.resx文件的属性,您将注意到“自定义工具”属性的值为“ResXFileCodeGenerator”.理论上你应该可以实现你自己的生成器来执行你提到的翻译步骤.事实上,这个翻译不一定是你所说的一次性的事情.翻译过程应该生成一个新文件,但保留原始文件.对原始文件的任何更改都会导致Visual Studio重新生成自动生成的文件.
我没有试图自己实现自定义生成器,但我认为这些文章是相关的:Implementing Single File Generators和Registering Single File Generators
<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#代码的结果输出.