如何使用Reflection.Emit初始化和定义const字符串

时间:2010-08-13 20:54:27

标签: .net reflection.emit

我需要.Net Reflection.Emit的帮助。

需要在其中创建包含Assemblypublic struct字段的简单string。字段必须是常量,我还需要定义它。总之,我需要得到Assembly这样的东西:

namespace n {
    struct Alpha {
        public const string DATA = "Alpha";
    }
}

我不明白如何创建string字段以及如何定义它。

此刻我正在写这段代码:

private static void Generate()
{
    var an = new AssemblyName("Beta") { Version = new Version("1.0.0.0") };
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);
    var mb = ab.DefineDynamicModule("BetaModule", "Beta.dll");
    var tb = mb.DefineType("n.Beta", TypeAttributes.Public, typeof(System.ValueType));
    // What I need do after it? How I understand from MSDN I need call DefineInitializedData method but i am not shure how do it.
    tb.CreateType();
    ab.Save("Beta.dll");
}

解决方案:

private static void Generate() {
    var an = new AssemblyName("Beta") { Version = new Version("1.0.0.0") };
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);
    var mb = ab.DefineDynamicModule("BetaModule", "Beta.dll");
    var tb = mb.DefineType("n.Beta", TypeAttributes.Public, typeof(System.ValueType));
    var fb = tb.DefineField("DATA", typeof(string), FieldAttributes.Public | FieldAttributes.Literal);
    fb.SetConstant("Beta");
    tb.CreateType();
    ab.Save("Beta.dll");
}

我不确定它是100%正确,但它确实有效。顺便说一句,如果有人会检查它会很棒。也许我犯了一些错误......

1 个答案:

答案 0 :(得分:2)

常数对IL没有意义。它们由编译器编译,它将它们的字面值发送到IL中。当您使用Reflect.Emit时,您正在扮演编译器的角色,您自己发出了值。

这不是一个真正的问题,你可以在你自己的代码中声明const。每当需要使用const时,都会发出ldc或ldstr操作码。