Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Reflection.Emit генерация сборки со структурой


Автор: req 12.8.2010, 07:25
Доброго времени суток.

Необходимо сгенерировать сборку содержащую структуру со строковой константой:

Код

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


Можно ли это сделать силами Reflection.Emit ? С генерацией классов я разобрался, а вот касательно генерации структур информацию найти не могу. Заранее спасибо.

Автор: diadiavova 12.8.2010, 07:33
Цитата(req @  12.8.2010,  08:25 Найти цитируемый пост)
 С генерацией классов я разобрался, а вот касательно генерации структур информацию найти не могу.

Просто укажи в качестве базового класса ValueType.

Автор: req 12.8.2010, 16:56
Подскажите пожалуйста, каким образом указать что поле является константой и задать ее значение?

Нашел http://forum.vingrad.ru/topic-59866.html похожее обсуждение.

Собственно целый день читая msdn пришел к выводу что необходимо воспользоваться методом DefineInitializedData, но при этом есть ряд вопросов:

1. каким образом указать, что тип поля string?
2. каким образом указать что поле является константой?

Меня так же достаточно сильно смущает заметка в MSDN:
Цитата
Static автоматически включен в attributes.


На данный момент создал вот такой код:

Код
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));


var fb = tb.DefineInitializedData("DATA", new byte[] { 01, 00, 01 }, FieldAttributes.Public | FieldAttributes.Literal);

mb.CreateGlobalFunctions();

tb.CreateType();

ab.Save("Beta.dll");


Впрочем поле он не создает (просматриваю полученный код в Object Browser).

Автор: diadiavova 12.8.2010, 17:19
Цитата(req @  12.8.2010,  17:56 Найти цитируемый пост)
1. каким образом указать, что тип поля string?
2. каким образом указать что поле является константой?

Код

var stringConst = tb.DefineField("StringConstant", typeof(string), System.Reflection.FieldAttributes.Literal )

Автор: req 14.8.2010, 13:44
Если кому нибудь потребуется:

Код
    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");
    }


А ларчик так просто открывался...

diadiavova, спасибо за помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)