Кастинг указателей в выражениях? - PullRequest
1 голос
/ 24 декабря 2010

Я пытаюсь создать GraphicsDevice в XNA 4.0 из уже существующего устройства. Для этого я пытаюсь вызвать не публичный конструктор GraphicsDevice (IDirect3DDevice9 * pInterface, GraphicsDevice pDevice). Обратите внимание, что для этого требуется указатель, который вызывает у меня много проблем.

 ConstructorInfo ctor = typeof(GraphicsDevice).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];
 ParameterInfo[] paramsInfo = ctor.GetParameters();

 var args = new Expression[]
    {
     Expression.Convert(Expression.Call(Expression.Constant(pointer), typeof(IntPtr).GetMethod("ToPointer")), paramsInfo[0].ParameterType), 
     Expression.Constant(null, typeof(GraphicsDevice)),
    };

 NewExpression newExp = Expression.New(ctor, args);

 LambdaExpression lambda = Expression.Lambda(typeof(Func<GraphicsDevice>), newExp);

 var compiled = (Func<GraphicsDevice>)lambda.Compile();
 GraphicsDevice device = compiled();
 return device;

Проблема возникает в этой строке, где выдается исключение:

Expression.Convert(Expression.Call(Expression.Constant(pointer), typeof(IntPtr).GetMethod("ToPointer")), paramsInfo[0].ParameterType), 

Исключение составляет:

Не определен оператор приведения между типами 'System.Void *' и 'IDirect3DDevice9 *'.

Есть ли способ обойти это? Я уже пробовал различные другие методы с Pointer.Box, Activator и вручную вызывал конструктор.

1 Ответ

0 голосов
/ 30 марта 2011

Я могу заставить конструктор действительно работать со следующим кодом, однако он все еще умирает с нулевой исключительной ссылкой внутри внутреннего метода CreateHelperClasses.Я не думаю, что этот конструктор используется для того, что вы думаете.Я не уверен, что то, что вы пытаетесь сделать, на самом деле, к сожалению, возможно.

 unsafe
        {
           // this seems to always be null
           GraphicsDevice parent = (GraphicsDevice)typeof(GraphicsDevice).GetField("_parent", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(oldDevice);

           IntPtr pInterface = new IntPtr(Pointer.Unbox(typeof(GraphicsDevice).GetField("pComPtr", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(oldDevice)));               

           ConstructorInfo ci = typeof(GraphicsDevice).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];

           GraphicsDevice newDevice = (GraphicsDevice)ci.Invoke(new object[] { pInterface, parent });
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...