2014-12-10 1 views
1

F #의 Reflection Emit으로 해킹 중입니다. 이 C# 코드와 동일한 작업을 수행하려고합니다.Reflection.Emit unsafe code

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"); 

특히 줄은 definefield입니다. F 번호에서 내가 얻을 수있는 가장 가까운

또한 대신 INT의 유형을 IntPtr *. (nativeint로 너무 다른 유형에 대한 IntPtr입니다 그것의 주)의 컴파일 컴파일 된 필드가 끝나는 그러나

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

이며, 나는 프로그래밍 방식으로 정의 된 정의 된 구조체를 사용할 수 있고 다른 구조체에서 Foo *를 가질 수 있지만이 경우에는 typeof를 사용할 수 없다 (C# 또는 F # 중 하나). Type/TypeBuilder에서 Foo *로 필드를 정의하는 방법이 있습니까? 사람이 (내가 동의)이 모든 잠재적 미친 것을 지적하기 전에 자신을 내가 C#을 나에게 :)

답변

2

I을하지 mignt 코드를 생성 할 수있는 방법을 미친 파악하기 위해

, 그것은 재미있는 프로젝트입니다 ilsigptr<int>은 C#의 F # 대응 물 int*입니다.

은 참조 :

+0

이 1 일 경우 위대한 작품 : 하자의 F 대해서 typeof = t.DefineField ("foo는"(< ilsigptr >), FieldAttributes.Public 감사! 두번째 경우 하자 p 용 –

+0

= typedefof > .MakeGenericType ([| t> 유형 |]) 하자가 F = t.DefineField ("REC", P FieldAttributes.Public)는 는 그것은 InvalidOperation 예외가 발생 MakeGenericType에로, ilsigptr위한 일반적인 유형을 유추 반면 하자위한 p = > .MakeGenericType ([| t> 유형 |]) typedefof 하자 F = t.DefineField ("REC", P FieldAttributes .Public) 훌륭한 작품입니다. 나는 ilsigptr에 대해 뭔가 특별한 것을 추측하고 있지만, 생성 된 struct에 대한 포인터에 액세스하는 것은 좋을 것입니다. 의견이 있으십니까? –

+1

사실 모든 경우에 적용되는이 작업을 수행 할 수 있습니다. let p = t.MakePointerType() let f = t.DefineField ("rec", p, FieldAttributes.Public) 휴. 다니엘 도와 줘서 고마워. 그것이 올바른 방향으로 커다란 "포인터"였기 때문에 대답으로 표시합니다. –

관련 문제