Я пытаюсь создать 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 и вручную вызывал конструктор.