我可以使用 roslyn 和新的 .net 项目格式在构建时创建 类 吗?
Can I use roslyn and the new .net project format to create classes on build?
我有一个项目使用新的 .net 项目格式(dnx
和 project.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;
}
}
如你所见,里面有很多管道:
- 操作码列表
- 每个操作码的静态 Getter
- 一种通过二进制值查找 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
我有一个项目使用新的 .net 项目格式(dnx
和 project.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;
}
}
如你所见,里面有很多管道:
- 操作码列表
- 每个操作码的静态 Getter
- 一种通过二进制值查找 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