我有一个项目使用新的.net项目格式(dnx
和project.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,应用程序的实际内容。将它包装在字典中并创建静态getter应该为我完成。
我知道&#34;常规&#34; Visual Studio有T4模板,但这些在构建上运行很麻烦,似乎与visual studio绑定,因此不再适用。
我能做些什么吗?我想我可以在project.json中创建自定义动作(例如,dnx . regenopcodes
)但我不知道我将在这里运行什么,因为我需要调用Roslyn,找到OpCodes列表(可能是make一个抽象的OpCodesBase
类),解析它,并为我生成具体的OpCodes
类。
或者,我可以创建一个opcodes.xml文件并使用普通的文本解析来从中创建.cs,但是我不知道我在任何时候配置dnx . run
它首先运行我的发电机然后做正常的事情。
答案 0 :(得分:2)