我正在使用F#中的反射发射进行一些黑客攻击。我正在尝试执行与下面的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*,但显然在这种情况下(在C#或F#中)我不能使用typeof。有没有办法从Type/TypeBuilder中将字段定义为Foo*?
在任何人指出这一切都有潜在的疯狂之处之前(我同意),这是一个有趣的项目,让我自己弄清楚,我可以生成C#不允许我生成的代码有多疯狂:)
发布于 2014-12-11 04:14:31
我相信ilsigptr<int>是C#的int*的F#对应物。
另请参阅:
ilsigptr<'T> on MSDN,死链接,请参阅archived copyhttps://stackoverflow.com/questions/27409760
复制相似问题