Reflection.Emit небезопасный код

Я занимаюсь хакерством с Reflection Emit в F #. Я пытаюсь сделать эквивалент этого кода С#:

var ass = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.RunAndSave);
var mb = ass.DefineDynamicModule("Test", "Test.dll", false);
var t = mb.DefineType("Foo", TypeAttributes.Public, typeof(ValueType));
t.DefineField("foo", typeof(int*), FieldAttributes.Public);
t.CreateType();
ass.Save("Test.dll");

Строка, в частности, является строкой определения поля. В F # самое близкое, что я могу получить, это

let f = t.DefineField("foo", (typeof<nativeptr<int>>), FieldAttributes.Public)

Однако скомпилированное поле в конечном итоге компилируется в тип IntPtr вместо int*. (Обратите внимание, что это IntPtr для nativeint или любого другого типа)

Кроме того, я хотел бы иметь возможность использовать структуру, которую я определил программно, и иметь Foo* в другой структуре, но, очевидно, в этом случае я не могу использовать typeof (ни в C#, ни в F#). Есть ли способ определить поле как Foo* из Type/TypeBuilder?

Прежде чем кто-либо укажет, что все это потенциально безумно (и я согласен), это забавный проект для меня, чтобы выяснить, насколько сумасшедшим я могу генерировать код, который С# не может мне позволить :)


person neil danson    schedule 10.12.2014    source источник


Ответы (1)


Я считаю, что ilsigptr<int> является аналогом F# int* в C#.

Смотрите также:

person Daniel    schedule 10.12.2014
comment
Это прекрасно работает для первого случая: пусть f = t.DefineField(foo, (typeof‹ilsigptr‹int››), FieldAttributes.Public) Спасибо! - person neil danson; 11.12.2014
comment
Для второго случая пусть p = typedefof‹ilsigptr‹_››.MakeGenericType([|t :›Type|]) let f = t.DefineField(rec, p, FieldAttributes.Public) Выдает исключение InvalidOperation для MakeGenericType, поскольку оно как предполагается, общий тип для ilsigptr, тогда как для let p = typedefof‹Action‹_››.MakeGenericType([|t :› Type|]) let f = t.DefineField(rec, p, FieldAttributes.Public) отлично работает. Я предполагаю, что в ilsigptr есть что-то особенное, но было бы здорово получить доступ к указателю на сгенерированную структуру. Есть предположения? - person neil danson; 11.12.2014
comment
На самом деле, оказывается, вы можете сделать это, что работает для всех случаев let p = t.MakePointerType() let f = t.DefineField(rec, p, FieldAttributes.Public) Фух. Спасибо за помощь Даниил. Пометка как ответ, так как это был большой указатель в правильном направлении. - person neil danson; 11.12.2014
comment
Ах, слишком просто. Рад, что ты понял это. - person Daniel; 11.12.2014