我可以使用 roslyn 和新的 .net 项目格式在构建时创建 类 吗?

Can I use roslyn and the new .net project format to create classes on build?

我有一个项目使用新的 .net 项目格式(dnxproject.json,目前使用 dnvm 和 mono-1.0.0-beta4,最终想使用 coreclr一旦他们 dnu restore 在 *NIX 上工作)。

我在使用 .net/C# 时遇到的一个常见问题是希望在编译时创建代码。例如,我有一个虚拟机,它有一个 helper class 像这样:

public static class OpCodes {
    private readonly static IDictionary<byte, OpCode> _opcodes;

    public static OpCode MOV { get; private set; }
    public static OpCode ADD { get; private set; }
    public static OpCode SUB { get; private set; }

    static OpCodes() {
        // OpCode class contains info, e.g., the number of arguments
        MOV = new OpCode(0x00, "MOV", 2);
        ADD = new OpCode(0x01, "ADD", 0);
        SUB = new OpCode(0x02, "SUB", 0);

        _opcodes = new Dictionary<byte, OpCode> {
            { MOV.Code, MOV },
            { ADD.Code, ADD },
            { SUB.Code, SUB },
        };
    }

    public static OpCode Get(byte code) {
        OpCode result;
        if(_opcodes.TryGetValue(code, out result)) {
            return result;
        }
        return null;
    }
}

如你所见,里面有很多管道:

  1. 操作码列表
  2. 每个操作码的静态 Getter
  3. 一种通过二进制值查找 OpCode 的方法

我唯一需要创建的是#1,应用程序的实际内容。将它包装在字典中并创建静态 getter 应该为我完成。

我知道 "regular" Visual Studio 有 T4 模板,但这些模板对 运行 构建来说很痛苦,似乎与 visual studio 相关联,因此不再适用。

有什么我可以做的吗?我想我可以在 project.json 中创建自定义操作(例如,dnx . regenopcodes),但我不知道我会在这里 运行ning 什么,因为我需要调用 Roslyn,找到列表OpCodes(也许做一个抽象 OpCodesBase class),解析它,并为我生成具体的 OpCodes class。

或者,我可以创建一个 opcodes.xml 文件并使用普通文本解析从中创建一个 .cs,但我不确定我在任何时候都将如何配置它 dnx . run它首先 运行 是我的发电机,然后执行它正常执行的任何操作。

您可以添加一个预编译步骤,类似于 Razor 对预编译视图所做的操作:https://github.com/aspnet/Mvc/blob/64e726d2b26422c5452475627e4afaba307edec3/src/Microsoft.AspNet.Mvc/RazorPreCompileModule.cs

这是另一个例子:https://github.com/aspnet/dnx/blob/e937e25ab3453ea86bda13c1297c41011dfda9de/ext/compiler/preprocess/Internalization.cs

这就是你连接它的方式https://github.com/aspnet/dnx/blob/3d20719b0a985b6960a3f87d9f5f9b6c3f71b7bc/src/Microsoft.Framework.Runtime/project.json#L16-L18