Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反射。发出不安全代码_C#_.net_F#_Reflection.emit - Fatal编程技术网

C# 反射。发出不安全代码

C# 反射。发出不安全代码,c#,.net,f#,reflection.emit,C#,.net,F#,Reflection.emit,我正在用F#中的反射发射进行一些黑客攻击。我正在尝试做类似于C代码的事情: 该行尤其是definefield行。在F#中,我能得到的最接近的是 设f=t.DefineField(“foo”,(typeof),FieldAttributes.Public) 但是,编译后的字段最终被编译为IntPtr类型而不是int*(注意,对于nativeint或任何其他类型,它也是IntPtr) 此外,我希望能够使用我通过编程定义的结构,并在另一个结构中使用Foo*,但显然,在这种情况下,我不能使用typeo

我正在用F#中的反射发射进行一些黑客攻击。我正在尝试做类似于C代码的事情:

该行尤其是definefield行。在F#中,我能得到的最接近的是

设f=t.DefineField(“foo”,(typeof),FieldAttributes.Public)
但是,编译后的字段最终被编译为IntPtr类型而不是int*(注意,对于nativeint或任何其他类型,它也是IntPtr)

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

在任何人指出这一切都可能是疯狂的(我也同意),对于我自己来说,这是一个有趣的项目,来弄清楚我能生成C不允许的代码有多疯狂:)

我相信
ilsigptr
是C的
int*
的F对应物

另见:

  • ,死链接,请参阅
  • ,死链接,请参阅

这对于第一种情况非常有效:让f=t.DefineField(“foo”,(typeof),FieldAttributes.Public)谢谢!对于第二种情况,让p=typedefof.MakeGenericType([| t:>Type |])让f=t.DefineField(“rec”,p,FieldAttributes.Public),它在MakeGenericType上抛出一个InvalidOperation异常,因为它推断出ilsigptr的泛型类型,而对于让p=typedefof.MakeGenericType([| t:>Type |])让f=t.DefineField(“rec”,p,FieldAttributes.Public)非常有效。我猜ilsigptr有一些特殊之处,但是如果能够访问指向生成结构的指针,那就太好了。有什么想法吗?事实上,你可以这样做,这对所有情况都有效让p=t.MakePointerType()让f=t.DefineField(“rec”,p,FieldAttributes.Public)Whew。谢谢你的帮助,丹尼尔。因为这是一个指向正确方向的大“指针”,所以标记为答案。啊,太容易了。很高兴你明白了。
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");