Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reflection.Emit генерация сборки со структурой 
:(
    Опции темы
req
Дата 12.8.2010, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.8.2010

Репутация: нет
Всего: нет



Доброго времени суток.

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

Код

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


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

Это сообщение отредактировал(а) req - 14.8.2010, 13:50
PM MAIL   Вверх
diadiavova
Дата 12.8.2010, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



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

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
req
Дата 12.8.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.8.2010

Репутация: нет
Всего: нет



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

Нашел тут похожее обсуждение.

Собственно целый день читая 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).

PM MAIL   Вверх
diadiavova
Дата 12.8.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



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

Код

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



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
req
Дата 14.8.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.8.2010

Репутация: нет
Всего: нет



Если кому нибудь потребуется:

Код
    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, спасибо за помощь

Это сообщение отредактировал(а) req - 14.8.2010, 13:49
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.