| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Reflection.Emit |
| Автор: jfx 28.7.2005, 14:41 |
| Есть проблема. Нужно создать сборку с одним классом в котором присутствует одно public static поле, с данными. Поэтому встает проблема с .cctor Информации в практически нет на эту тему Значит так, попорядку. Я создаю сборку в ней модуль в ней тип, далее поле. Ок тут проблем нет. Далее создаю .cctor и мне нужно проинициализировать созданное поле. Как я пытаюсь сделать: откомпилил класс как он должен быть, прогнал его через ildasm и теперь пытаюсь повторить то что получилось. Проблемы возникают с <PrivateImplementationDetails> структурой и данными собственно. Как их создать. С этим ладно кое как криво но что-то получилось. Далее мне нужно теперь мне нужно загрузить в стек token этой структуры и вот тут я совсем не знаю что делать Люди добрые помогите. Может я плохо искал и где-то есть подробная информация как инициализировать статическое поле? Или можно это делать как-то иначе? Спасибо. |
| Автор: mr.DUDA 28.7.2005, 15:22 | ||||
Вот такой исходный код:
Превращается в вот такой IL-код:
Может, это хоть чем-то поможет. |
| Автор: jfx 28.7.2005, 15:45 | ||||||
| Спасибо за ответ, но видимо я не совсем точно выразился. Есть вот такой класс:
После копиляции он превращается вот в это:
Мне же нужно воспроизвести все это с помощью Reflection.Emit Вопросы связанные с созданием сборкои, модуля, класса и поля решены (это несложно). Не решенным остался вопрос с инициализацией этого самого статического поля. Т.е. я делая статический конструктор и из него пытаюсь инициализировать поле (возможно есть более простой способ, но я о мен ничего не знаю). Примерно это выглядит так:
Что делать дальше я не пойму. |
| Автор: Guest 28.7.2005, 19:27 |
| FieldBuilder dataField = pointTypeBld.DefineField("Data",typeof(byte[]),FieldAttributes.Public | FieldAttributes.Static); |
| Автор: Guest 28.7.2005, 21:15 |
| 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 28.7.2005, 21:22 |
| 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 28.7.2005, 21:36 |
| thanks, i will try. |
| Автор: jfx 29.7.2005, 10:49 |
| Thanks, it's work. One more question: How i can call InitializeArray? |
| Автор: Guest 31.7.2005, 16:31 |
| You should use cctorIL.EmitCall(OpCodes.Call,...,null); |
| Автор: jfx 6.8.2005, 15:38 | ||
Все получилось. Проблема была в том что я пытался передать методу параметры, а нужно было передать только их тип (параметры то уже в стеке
Всем спасибо. |