![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| jfx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 18.10.2004 Репутация: 1 Всего: 1 |
Есть проблема.
Нужно создать сборку с одним классом в котором присутствует одно public static поле, с данными. Поэтому встает проблема с .cctor Информации в практически нет на эту тему Значит так, попорядку. Я создаю сборку в ней модуль в ней тип, далее поле. Ок тут проблем нет. Далее создаю .cctor и мне нужно проинициализировать созданное поле. Как я пытаюсь сделать: откомпилил класс как он должен быть, прогнал его через ildasm и теперь пытаюсь повторить то что получилось. Проблемы возникают с <PrivateImplementationDetails> структурой и данными собственно. Как их создать. С этим ладно кое как криво но что-то получилось. Далее мне нужно теперь мне нужно загрузить в стек token этой структуры и вот тут я совсем не знаю что делать Люди добрые помогите. Может я плохо искал и где-то есть подробная информация как инициализировать статическое поле? Или можно это делать как-то иначе? Спасибо. |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Вот такой исходный код:
Превращается в вот такой IL-код:
Может, это хоть чем-то поможет. -------------------- ![]() |
||||
|
|||||
| jfx |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 18.10.2004 Репутация: 1 Всего: 1 |
Спасибо за ответ, но видимо я не совсем точно выразился.
Есть вот такой класс:
После копиляции он превращается вот в это:
Мне же нужно воспроизвести все это с помощью Reflection.Emit Вопросы связанные с созданием сборкои, модуля, класса и поля решены (это несложно). Не решенным остался вопрос с инициализацией этого самого статического поля. Т.е. я делая статический конструктор и из него пытаюсь инициализировать поле (возможно есть более простой способ, но я о мен ничего не знаю). Примерно это выглядит так:
Что делать дальше я не пойму. |
||||||
|
|||||||
| Guest |
|
|||
|
Unregistered |
FieldBuilder dataField = pointTypeBld.DefineField("Data",typeof(byte[]),FieldAttributes.Public | FieldAttributes.Static);
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Like this:
// Code size 13 (0xd) .maxstack 3 IL_0000: ldc.i4.3 IL_0001: newarr [mscorlib]System.Byte IL_0006: dup IL_0007: ldtoken field valuetype $ArrayType$3 ns.Class1::Data IL_000c: ret |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
The quickest way to do this is instead of:
FieldBuilder fieldBuild = typeBuild.DefineField("Data", typeof(byte[]), FieldAttributes.Public | FieldAttributes.Static); typeBuild.DefineInitializedData("__data", data, FieldAttributes.Static); use the following: FieldBuilder fieldBuild = typeBuild.DefineInitializedData("Data", data, FieldAttributes.Public | FieldAttributes.Static); . . . cctorIL.Emit(OpCodes.Ldc_I4_3); cctorIL.Emit(OpCodes.Newarr,typeof(System.Byte)); cctorIL.Emit(OpCodes.Dup); cctorIL.Emit(OpCodes.Ldtoken,fieldBuild); cctorIL.Emit(OpCodes.Ret); |
|||
|
||||
| jfx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 18.10.2004 Репутация: 1 Всего: 1 |
thanks, i will try.
|
|||
|
||||
| jfx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 18.10.2004 Репутация: 1 Всего: 1 |
Thanks, it's work.
One more question: How i can call InitializeArray? |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
You should use
cctorIL.EmitCall(OpCodes.Call,...,null); |
|||
|
||||
| jfx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 18.10.2004 Репутация: 1 Всего: 1 |
Все получилось. Проблема была в том что я пытался передать методу параметры, а нужно было передать только их тип (параметры то уже в стеке
Всем спасибо. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |