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

时间:2015-05-11 17:16:49

标签: c# .net asp.net-core roslyn .net-core

我有一个项目使用新的.net项目格式(dnxproject.json,当前使用dnvm和mono-1.0.0-beta4,最终想要使用coreclr让dnu restore处理* NIX)。

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

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. 每个操作码的静态获取者
  3. 通过它的二进制值
  4. 查找OpCode的方法

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

    我知道&#34;常规&#34; Visual Studio有T4模板,但这些在构建上运行很麻烦,似乎与visual studio绑定,因此不再适用。

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

    或者,我可以创建一个opcodes.xml文件并使用普通的文本解析来从中创建.cs,但是我不知道我在任何时候配置dnx . run它首先运行我的发电机然后做正常的事情。