通过代码生成向C#添加关键字?

通过代码生成向C#添加关键字?,c#,visual-studio,code-generation,metalanguage,C#,Visual Studio,Code Generation,Metalanguage,我有一种特定于领域的语言,我希望通过添加新的关键字(或一些类似关键字的语法)与C#交互。使用属性是不够的(我不能在方法体中使用它们),而将其硬塞进“有效”的C#符号并编译成其他东西将是丑陋的,并破坏与DSL的类比(并且从类似DSL的符号转换为C#是不平凡的,所以每次只写C#是不可能的) 我已经有办法解析.cs文件,并将其转换为合法的、非平凡的、可以编译的C代码 问题是,即使我能够完成定义DSL、解析DSL并将其转换为有效C#的所有工作,Visual Studio也不会让我使用它不理解的符号;它只

我有一种特定于领域的语言,我希望通过添加新的关键字(或一些类似关键字的语法)与C#交互。使用属性是不够的(我不能在方法体中使用它们),而将其硬塞进“有效”的C#符号并编译成其他东西将是丑陋的,并破坏与DSL的类比(并且从类似DSL的符号转换为C#是不平凡的,所以每次只写C#是不可能的)

我已经有办法解析.cs文件,并将其转换为合法的、非平凡的、可以编译的C代码

问题是,即使我能够完成定义DSL、解析DSL并将其转换为有效C#的所有工作,Visual Studio也不会让我使用它不理解的符号;它只是添加红色的曲线,发出一个错误“无法解析符号”,然后常常无法正确解析之后的内容

有没有办法强制visual studio在其分析中忽略特定字符串?我看过VisualStudio插件,但是看起来,尽管我可以做语法突出显示和其他事情,但我不能强迫它忽略它不知道如何解析的东西(除非我在扩展API中缺少某种方法来完成这一点,这当然是可能的)


我已经浏览了Roslyn的资料,也没有立即找到一种方法。(同样,可能遗漏了一些东西,它似乎没有很好的文档。)

看看PowerLanguages.E:


还没有英文文档,抱歉

你不能强迫VS理解你的C#语法,因为它不是有效的C#语法。这是你的DSL,不是C。您可以更改文件的扩展名以使VS确信它不是C#文件,并为新语言定义语法高亮插件。我不希望它理解语法--我有一个预构建过程可以理解它。我希望它忽略语法。更改扩展名应该可以做到这一点:VS将忽略文件的语法,将其视为文本。我不希望它被视为文本,我希望它被视为有效的C,因为除了对DSL的一些引用之外,它是有效的C……这就是我的观点:你不能让VS将你的代码视为有效的C,除非它是纯的,100%有效,C#。“几乎有效”是“无效”的同义词——简单明了。当然,有一些方法可以使其有效——例如,将您的DSL伪装成解析器理解的某种特殊格式的注释。在这种情况下,您的语言将再次成为有效的C#,而VS不会抱怨。