10

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

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

  • 对编译程序集的反思
  • 罗斯林 CTP

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

我想知道:

a) Roslyn 是否提供了反射无法实现的功能?我的理解是我无法通过反射获得方法体。

b) Roslyn CTP 许可证会阻止我在开源许可证下分发该工具吗?阅读许可证后我不清楚

4

8 回答 8

3

我只是按照这些思路做了一些事情——非常适合从你的 c# 类在 Typescript 中创建你的数据模型。我构建它是为了生成一个具有模拟模型基本数据的接口的单个​​ AMD 模块。还支持泛型,并创建一个具有 Knockout 属性的类,包括一个 toJS() 方法和一个 update(data:Interface) 方法来更新你的类。

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

如果您使用数据注解,还支持数据模型的 [KeyAttribute] 和 [Timespan] 属性。

于 2014-08-01T02:17:15.947 回答
2

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

使用 Roslyn,您基本上只是在解析 c#。Roslyn 在这方面做得很好,但我犹豫要不要从 Reflection 切换到它。通过反射,您可以获得更可靠的元数据。

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

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

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

编辑:自从写了这个答案后,我咬紧牙关转而使用 Roslyn。一旦你掌握了它,它就会变得相当强大,而且我确实发现了一个很大的优势:你可以从 Visual Studio 插件中获得对工作区的引用,并轻松地在插件中做各种事情。

于 2017-01-10T21:18:24.767 回答
1

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

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

于 2013-12-21T16:16:22.053 回答
1

2018 年 11 月更新

接受的答案是有效的,因为它的日期是 2013 年 4 月

现在roslyn在Apache License Version 2.0 下分发

许可证摘录:

重新分配。

您可以在任何媒介中复制和分发作品或其衍生作品的副本,无论是否经过修改,并且以源或对象形式,只要您满足以下条件:...

Roslyn 有许多nuget 包

于 2018-11-19T14:15:49.583 回答
0

更新 - 2015 年 7 月

Roslyn 仍在 CTP 中,但他们在 GitHub 上的常见问题解答更重要:

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

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



原始答案(2012 年 11 月)

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

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

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

  • 代码以源代码形式公开或分发;或项目
  • 其他人有权对其进行修改。

起初,如果您只包含 Roslyn 二进制文件,听起来您可以做到这一点,但可分发代码定义明确指出“软件包含代码......”,我相信这就是后面的所有内容。

对于您的另一个问题,Roslyn 尚未完全完成,仍处于测试阶段。我不确切知道它当前是否处于允许它处理您的需求的状态。这就是你可能只想花几个小时修补的东西。我认为它的功能不会超过 .NET 当前允许的功能。您可以在此处查看他们最近在 9 月添加的内容以及当前未在此处实施的内容。

于 2012-11-09T22:48:48.507 回答
0

Roslyn 网站没有明确指出:

当前许可证仅用于评估和预览目的,不允许重新分发 Roslyn 二进制文件。允许共享基于 Roslyn API 构建的示例项目,但示例用户必须安装 Roslyn CTP 或 Roslyn NuGet 包才能构建和运行。

于 2013-04-04T20:39:22.260 回答
0

我不会使用当前的 Roslyn CTP - 仅仅是因为 2014 年会有新版本,而这些肯定会带来许多重大变化。因此,您最终可能会得到完全弃用的代码。

(最近有一个 MS 团队成员的博客文章,但恐怕我目前手头没有链接。)

编辑
Roslyn 很有可能会获得一个也允许用于商业用途的许可证......

于 2013-12-21T16:23:43.650 回答
0

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

所以,有同样的需求,我开始用Roslyn做实验,看起来很有希望,但我对如何正确使用它有很多疑问......

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

于 2015-10-30T08:44:19.693 回答