Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展C#语法的想法_C#_Visual Studio_Vs Extensibility - Fatal编程技术网

扩展C#语法的想法

扩展C#语法的想法,c#,visual-studio,vs-extensibility,C#,Visual Studio,Vs Extensibility,不幸的是,C不允许额外的用户定义语法。但是我想知道是否有可能通过利用VisualStudioOnBuild事件来超越这个限制 假设我有一些语法糖,可以很容易地翻译成实际的C代码。 如果我在构建C#-项目之前自动将包含此新语法的cs文档转换为有效的cs文档,那么该项目可以成功构建。总的来说,这就像我扩展了C语言一样,因为我从一个包含非官方语法的无效cs文档开始,但它还是编译了 我意识到这有一些问题,比如这个翻译是永久的。这可能可以通过恢复原始cs来避免(应该在调试结束后恢复,否则一些IDE功能将丢

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

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

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

请让我知道你对这个想法的看法。这是可能的,如果是的话,有人能告诉我一些有用的教程来实现这一点吗?具体地说,就是攻入构建事件。
我搜索了MSDN,但是主题(http://msdn.microsoft.com/en-us/library/hthab0h8.aspx)没有帮我。

我不确定这是个好主意,但我有个想法:也许你可以看看,下载SDK并检查文档。也许你可以做你想做的事情。

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

就我个人而言,我首先要澄清这一点,摆脱“扩展”C#语言的想法;相反,我认为它定义了一种新的语言,它在语法上与C#(我假设)相似。使用不同的文件扩展名,以便Visual Studio不会尝试将您的语言编译为C。(也许吧。csx?人们喜欢加上字母x,对吗?)

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

我自己还没有尝试实现自定义生成器,但我认为这些文章是相关的:,和

您的.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>

扩展CSharpCodeGenerator
Example.cs
真的
真的
Example.csx

其中Example.csx是包含扩展语法的源代码文件,Example.cs是将Example.csx转换为普通C#代码的结果输出。

对于Visual Studio中的T4模板来说,您所说的操作似乎是一项完美的任务


你可以定义你想要的任何东西;具有一定格式的文本文件、UML模型、数据库;你的T4模板可以用你希望的任何方式将它转换成代码。< / P>这不是一个好主意。@ SBI:我怀疑JBSnorro不是Bjarne Stroustrup。@ JSBSRORO:我仍然有人用C++宏做的噩梦。我是说,C是很好的扩展,但这并不是一般开发人员所拥有的权力。好吧,总结一下:一般来说,这个想法是不好的,除非某些语法是真正的改进,这是罕见的/困难的。但至少我了解到这是可能的,这与我之前的理解相反。完美,这正是我今天一直在寻找的,特别是解决方案资源管理器中动态生成的节点cs。非常感谢。我希望你提供的链接能让我达到目的:PAha!这就是我爱你的原因。:)这正是我想要的+1.是的,我已经研究过了,但我发现它不方便,因为它只能创建整个文档,而我更喜欢“基本上是常规的”cs文档,偶尔会有一些语法偏差。您对它的工作原理的理解并不完全正确。它也可以用来编辑现有的源代码。例如,在ASP.NET MVC Contrib T4模板中,现有的
Controller
类的基类已更改,其方法已更改为
Virtual
,以便继承生成的代码。