假设我有一些语法糖,可以很容易地转换成实际的C#代码。 如果我要自动将包含这种新语法的cs文档转换为有效的cs文档,那么在构建C#项目之前,项目就可以成功构建。总的来说,这就像我扩展了C#语言一样,因为我开始使用包含非官方语法的无效cs文档,但无论如何它都已编译。
我意识到这有一些问题,例如这种翻译是永久性的。这可能是通过恢复原始cs来避免的(在调试结束后应该恢复,否则会丢失一些IDE功能)。但这些是次要问题。
请让我知道你对这个想法的看法。这是可能的,如果是这样,有人可以指导我一些有用的教程,以实现这一目标吗?特别是点击进入建筑事件。 我搜索过MSDN,但主题(http://msdn.microsoft.com/en-us/library/hthab0h8.aspx)对我没有帮助。
答案 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 Generators和Registering 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并查看文档。也许你可以做你想要达到的目标。