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

1

Я делаю взлом с 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 в этом случае (в С# или F #). Есть ли способ определить поле как Foo * из Type/TypeBuilder?

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

Теги:
reflection.emit
f#

1 ответ

2

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

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

  • 0
    Это прекрасно работает для первого случая: let f = t.DefineField ("foo", (typeof <ilsigptr <int >>), FieldAttributes.Public) Спасибо!
  • 0
    Во втором случае пусть 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 есть что-то особенное, но было бы здорово получить доступ к указателю на сгенерированную структуру. есть идеи?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню