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

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

我有一个使用新的 .net 项目格式(dnxproject.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;
    }
}

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

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

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

我知道“常规”Visual Studio 有 T4 模板,但这些模板在构建时运行起来很痛苦,并且似乎与 Visual Studio 绑定(bind)在一起,因此不再适用。

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

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

最佳答案

关于c# - 我可以使用 roslyn 和新的 .net 项目格式在构建时创建类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173780/

相关文章:

c# - 在 TeamCity 构建结果中显示 `dnu publish` 异常

asp.net core 2.0 - 值不能为空。参数名称: connectionString

c# - 带参数的推送通知不接收 Windows Phone

c# - 如何从另一个 in-behind xaml 代码访问变量 in-behind xaml 代码

.net - System.ServiceModel、可移植类库和代码分析

.net - 使用 .NET 将 ffmpeg 管道传输到 oggenc(2)

c# - 如何为表单按钮编写鼠标事件?

c# - 6 个 List<int> 对象的交集

c# - 如何在 C# 应用程序中转换 C 结构?

c# - 如何为具有不同参数的同一Controller方法设置不同的路由?