Reflection.Emit不安全的代码

时间:2014-12-10 19:58:18

标签: c# .net f# reflection.emit

我在F#中使用Reflection Emit做了一些黑客攻击。我试图做相当于这个C#代码:

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 *。(注意它是针对nativeint或任何其他类型的IntPtr)

此外,我希望能够使用我以编程方式定义的结构,并在另一个结构中使用Foo *,但显然我在这种情况下无法使用typeof(在C#中或F#)。有没有办法从Type / TypeBuilder中将字段定义为Foo *?

在有人指出这可能是疯狂的(并且我同意)之前,我自己想出一个有趣的项目来弄清楚C#mignt不会让我生成的代码有多疯狂:)

1 个答案:

答案 0 :(得分:2)

我相信ilsigptr<int>是C#&#39; s int*的F#对应部分。

另见: