不幸的是,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/
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.