Как инициализировать и определить константную строку с Reflection.Emit

Мне нужна помощь. Net Reflection.Emit .

Необходимо создать простую сборку с публичной структурой и полем строки в ней. Поле должно быть постоянным, и мне также нужно его определить. В общем, мне нужно получить 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
задан Davide Cannizzo 25 July 2018 в 06:23
поделиться

1 ответ

Константы не имеют значения в IL. Они компилируются компилятором, он передает их буквальное значение в IL. Вы играете роль компилятора, когда используете Reflect.Emit, вы сами испускаете значение.

Это не проблема, вы можете просто объявить константу в своем собственном коде. И выдавать код операции ldc или ldstr всякий раз, когда необходимо использовать константу.

2
ответ дан 2 September 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: