我有一个使用新的 .net 项目格式(dnx
和 project.json
)的项目,当前使用 dnvm
和 mono-1.0。 0-beta4,一旦他们在 *NIX 上运行 dnu Restore
,最终希望使用 coreclr。
我在使用 .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;
}
}
如您所见,里面有很多管道:
- 操作码列表
- 每个操作码都有一个静态 Getter
- 一种通过二进制值查找操作码的方法
我唯一需要创建的是#1,即应用程序的实际内容。将它包装在字典中并创建静态 getter 应该为我完成。
我知道“常规”Visual Studio 有 T4 模板,但这些模板在构建时运行起来很痛苦,并且似乎与 Visual Studio 绑定(bind)在一起,因此不再适用。
有什么我可以做的吗?我想我可以在project.json中创建自定义操作(例如,dnx.regenopcodes
),但我不知道我会在这里运行什么,因为我需要调用Roslyn,找到OpCodes列表(也许创建一个抽象的 OpCodesBase 类),解析它,并为我生成具体的 OpCodes 类。
或者,我可以创建一个 opcodes.xml 文件并使用普通文本解析来从中创建一个 .cs,但我不确定在执行 dnx 时如何配置该文件。 run
它首先运行我的生成器,然后执行它通常执行的任何操作。
最佳答案
您可以添加预编译步骤,类似于 Razor 预编译 View 的操作:https://github.com/aspnet/Mvc/blob/64e726d2b26422c5452475627e4afaba307edec3/src/Microsoft.AspNet.Mvc/RazorPreCompileModule.cs
关于c# - 我可以使用 roslyn 和新的 .net 项目格式在构建时创建类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173780/