c# - 扩展 C# 语法的想法

标签 c# visual-studio vs-extensibility

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

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

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

请让我知道您对这个想法的看法。这可能吗?如果可以,有人可以指导我学习一些有用的教程来实现这一目标吗?具体来说就是利用构建事件。 我搜索了 MSDN,但主题 (http://msdn.microsoft.com/en-us/library/hthab0h8.aspx) 对我没有帮助。

最佳答案

我不会说这是否是个好主意,因为我对您要尝试做的事情知之甚少。不过,我建议这样做:您提议的是拥有某种“扩展的 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# 代码的结果输出。

关于c# - 扩展 C# 语法的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981825/

相关文章:

c# - 在 SQLite 数据库中获取文本框输入有效。但第二列不起作用。如何解决这个问题? (系统.Web.UI.WebControls.TextBox)

visual-studio - 是否可以覆盖 Visual Studio 2013 通知窗口

visual-studio-extensions - 为什么 VS2019 将我的扩展标记为已弃用

c# - 我应该在每个 TestMethod 中还是在 ClassInitialize 中设置模拟方法?

c# - 从其他用户控件加载用户控件 (ascx)

java - 如何对整数除法的结果进行四舍五入?

c# - Office.Interop.Word : How to add a picture to document without getting compressed

c++ - 已经定义的类 C++

c++ - 使用 Visual Studio 构建 Freetype 应用程序时出错

visual-studio-2008 - 如何将工具栏添加到 Visual Studio 加载项?