Roslyn vs反射TypeScript代码生成器

时间:2012-11-09 22:14:44

标签: c# .net reflection typescript roslyn

我正在开发一个TypeScript代码生成器,它将在C#类上使用自定义属性来生成TypeScript定义和代码文件。

我正在考虑使用TypeScript代码生成/源文件分析的两个选项:

  • 对已编译程序集的反思
  • Roslyn CTP

该工具将使用属性和方法上的自定义属性来生成TypeScript文件。现在我不打算将C#方法体转换为JavaScript,但将来可能会这样做。因此,我正在认真考虑罗斯林。但是,为了简单地生成我的TypeScript类的轮廓,我想我可以使用反射和自定义属性。

我想知道:

a)Roslyn是否提供了Reflection无法实现的功能?我的理解是我无法使用Reflection获得方法体。

b)Roslyn CTP许可证会阻止我在开源许可下分发该工具吗?这对我来说并不清楚after reading the license

8 个答案:

答案 0 :(得分:3)

我只是沿着这些方向做了一些事情 - 非常适合在c#类中使用Typescript创建数据模型。我构建它来生成一个带有接口的单个​​AMD模块,该接口模仿模型的基本数据。还支持Generics,并创建一个具有Knockout属性的类,包括toJS()方法和更新(data:Interface)方法来更新您的类。

整个事情只是一个T4模板。如果有人发现这个并且感兴趣:http://spabuilder.wordpress.com/2014/07/31/generating-typescript-from-c/

如果您使用数据注释,还要尊重数据模型的[KeyAttribute]和[Timespan]属性。

答案 1 :(得分:2)

我一直在搞乱生成js,而且我发现Reflection是一个更好的工具。我基本上将我的生成器指向项目的bin文件夹,元数据来自该文件夹。加载所有需要的程序集时可能会遇到一些困难,并且bin文件夹中包含程序集版本的警告以及生成器项目引用的相同程序集的版本。但是一旦你克服了所有这些,我用最小的难度做了,反射更容易使用,更可靠。

使用Roslyn,你基本上只是解析c#。罗斯林做得很好,但是我不愿意从反思转向它。通过反射,您可以更可靠地获得元数据。

假设您想要一个装饰控制器类的RoutePrefixAttribute的Prefix属性。如果您正在解析c#,您可能会: [RoutePrefix(" stringliteral")]或[RoutePrefix(constantString)]。因此,您必须担心它是文字还是常量表达式,然后找出如何获取常量表达式的值,担心可以将参数传递给属性的所有不同方式(例如,这会破坏你的代码:[RoutePrefix(Prefix =" literal")] ...

一旦您使用反射处理实际的运行时对象,一切都变得更加容易。你有一个很好的RoutePrefixAttribute对象,你可以去routePrefix.Prefix来可靠地获得前缀的值。

这只是如何使用Reflection更容易做事的一个例子。它是以类型安全的方式从一组c#对象收集元数据和从c#代码中抓取数据之间的区别,尽管有一个非常好的抓取工具。

编辑:自从写完这个答案后,我发现了子弹并切换到罗斯林。一旦掌握了它,它就相当强大,我确实找到了一个很大的优势:你可以从visual studio插件中获得对工作区的引用,并轻松地在插件中做各种各样的事情。

答案 2 :(得分:1)

许可证是否仅禁止您个人发布二进制文件?它不禁止您将NuGet包中的依赖项添加到Rosyln CTP NuGet包中。你个人无法提供这些,但你可以让NuGet自动拉入Roslyn。

因此,请避免将Rosyln源或二进制文件检入您的版本控制中。

答案 3 :(得分:1)

更新2018年11月

accepted answer有效,因为它的日期为2013年4月

现在roslynApache License 2.0版下分发

许可摘录:

  

重新分发。

     

您可以复制和分发以下内容的副本:         在任何媒介中,无论是否带有或不带有其作品,         修改并以“源”或“对象”形式提供,前提是您满足以下条件:...

罗斯林有多个nuget packages

答案 4 :(得分:0)

更新 - 2015年7月

罗斯林仍然在CTP,但他们的FAQ on GitHub更加重要:

  

对于示例代码或学习目的,重新分发Roslyn DLL的推荐方法是使用Roslyn NuGet包:[url:Microsoft.CodeAnalysis | http://www.nuget.org/packages/Microsoft.CodeAnalysis]

因此,您仍然无法在成品中重新分发DLL。该项目需要开源,解决方案需要参考NuGet包。



原始答案(2012年11月)

我不相信你可以在开源下分发。

  

6. 可分发的代码。该软件包含允许您在您开发的程序中分发的代码,如果您遵守该代码   以下条款。

     

6.c 分发限制您不得修改或分发任何可分发代码的源代码,以使其任何部分成为   受排除许可证限制。排除许可是一种   要求,作为使用,修改或分发的条件,

     
      
  • 代码以源代码形式披露或分发;或项目
  •   
  • 其他人有权修改它。
  •   

首先,如果您只包含Roslyn二进制文件,您可以这样做,但可分发代码定义明确说“软件包含代码......”我相信这就是一切之后指的是。

对于你的另一个问题,Roslyn尚未完全完成,仍然是Beta。我不确切地知道它目前是否处于允许它满足您需求的状态。这可能只是想花几个小时摆弄。我不认为它具有比.NET目前允许的功能更多的功能。您可以查看他们最近在9月份添加的内容here以及当前未实施的内容here

答案 5 :(得分:0)

罗斯林网站没有明确说明:

  

目前的许可仅用于评估和预览目的   不允许重新分发Roslyn二进制文件。分享   允许使用基于Roslyn API构建的示例项目,但需要样本   用户必须拥有Roslyn CTP或Roslyn NuGet包   安装以便构建和运行。

答案 6 :(得分:0)

我不会使用当前的Roslyn CTP - 只是因为2014年会有新版本,这些将带来许多重大变化。所以你最终可能会完全弃用代码。

(MS团队成员最近有一篇关于此的博客文章,但我担心目前手边没有链接。)

编辑
罗斯林很有可能获得允许商业用途的许可......

答案 7 :(得分:0)

对于我使用基于反射的T4代的经验,正如TypeLite所做的那样,在某种程度上更简单但有一些缺点,例如一旦项目依赖于已生成的类,通过重大更改重新生成它们(重命名为类)将导致非编译项目,因此再次运行模板将输出一个blanck文件,用户将很难再次编译所有内容。

所以,有了相同的需求,我开始尝试使用Roslyn,看起来很有希望,但我对如何正确使用它有很多疑问......

你可以看看我在做什么,也许可以在这里帮助我:https://github.com/TrabacchinLuigi/RoslynExporter