2013-08-10 3 views
0

일반 구조체 (blittable)에 대한 포인터를 캐스팅하기 위해 노력하고 있습니다. 비 - 일반 구조 => 다음으로 Marshal.PtrToStructure (...)를 사용할 수 있지만 그 함수가 일반 구조 (이유는?)를받지 못하는 경우 모두 정상적으로 보입니다.일반 구조체에 대한 포인터 캐스트

그래서 나는 다음 :

public static object ReadValue<T>(IntPtr ptr) where T : struct 
    { 
     var dm = new DynamicMethod("$", typeof(T), Type.EmptyTypes); 
      ILGenerator il = dm.GetILGenerator(); 
      il.Emit(OpCodes.Ldc_I4, ptr.ToInt32()); 
      il.Emit(OpCodes.Ldobj, typeof(T)); 
      il.Emit(OpCodes.Ret); 

      var func = (Func<T>)dm.CreateDelegate(typeof(Func<T>)); 
      return func(); 
    } 

하지만 이제는 Ldobj 명령에 문제가 있습니다. VS 제공 : 추가 정보 : 작업 런타임을 destabilize 수 있습니다.

내가 뭘 잘못하고 있니? 누구나이 문제에 대한 더 나은 접근법 (일반 구조에 대한 ptr)을 알고 있거나이 함수에서 오류를 발견 했습니까?

답변

1

이것이 일반 포인터와 함께 작동하는지는 잘 모르지만 형식 사이에 낮은 수준의 캐스트를하는 방법이 있습니다. 그것은

http://netpl.blogspot.com/2010/10/is-net-type-safe.html

+0

0이 감사의 FieldOffset에서 StructLayout 특성 및 여러 필드를 포함한다. 나는 그걸 기억하지 못했다. 하지만 불행히도 사실 일 수 있습니다 : genericApplicationType, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '어셈블리에서'PointerToStructure'1 '타입을로드 할 수 없습니다. 왜냐하면 일반 타입은 명시 적 레이아웃을 가질 수 없기 때문입니다. – dajuric

+0

당신은 제네릭을 잊어 버릴 수 있으며 그것을 객체로 전달하고 호출자에게 다시 캐스트 할 수 있습니다. –

+0

나는 인터페이스를 시도하고 그것은 나에게 오류를 준다. (주소는 중복 될 수 없다 ...). 개체에 특정 크기가 없기 때문에 개체를 사용할 수 없습니다 (FieldOffset (0)을 의미하는 경우). – dajuric