2010-08-13 2 views
1

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

Нужен создавать простые сборочный с общественной структурой и струнным полем в нем. Поле должно быть постоянным, и мне также нужно определить его. В целом мне нужно получить сборку, которая хранится внутри чего-то вроде этого:

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

Я не понимаю, как создать поле строки и как определить ее.

В данный момент я пишу этот код:

private static void Generate() { 
     var an = new AssemblyName("Beta") { Version = new Version("1.0.0.0") }; 

     var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save); // ToDo добавить путь к дирректории bin/debug проекта etalon 

     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% правильно, но его работа. Кстати, будет здорово, если кто-нибудь это проверит. Может, я ошибаюсь?

+0

, пожалуйста, найдите время, чтобы прочитать [FAQ] (http://stackoverflow.com/faq). Вы увидите, что это сайт Q & A, а не дискуссионный форум. Одним из результатов этого является то, что мы не используем подписи, линии тегов, «привет» или «спасибо». –

ответ

2

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

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

+0

Если я понимаю, что вы правы, я не могу создать const излучением, но я могу сделать поле readonly и объявить его в конструкторе. Правильно? –

+0

Подумайте об этом немного: почему бы не объявить const в вашем собственном коде? –

+0

Хорошо, поле только для чтения тоже будет хорошо. Но что мне нужно сделать, чтобы сделать это? 1. Создайте поле методом DefineField или DefineInitializedData? 2. Создайте конструктор по умолчанию для структуры 3. В поле определения конструктора Хорошо? Какой флаг мне нужно использовать для создания поля readonly? FieldAttributes.Literal? –

Смежные вопросы