c# .net com direct2d directwrite

c# - ¿Por qué Direct2D y DirectWrite no usan objetos COM tradicionales?



.net (3)

Estoy jugando con un pequeño motor de juego 2D en C # y decidí usar Direct2D y DirectWrite para renderizar. Sé que existe el API Code Pack de Windows y SlimDX, pero me gustaría profundizar y escribir una interfaz desde cero. Estoy tratando de hacerlo sin Managed C ++, pero Direct2D y DirectWrite no parecen usar objetos COM tradicionales. Definen las interfaces que se derivan de IUnknown , pero parece que no hay forma de usarlas realmente desde C # con COM interoperabilidad. Hay IID en d2d1.h , pero no CLSID.

Por supuesto, soy realmente nuevo en la interoperabilidad COM, así que tal vez me esté perdiendo algo. ¿Alguien puede arrojar algo de luz sobre esta situación?


El "Paquete de códigos API de Windows® para Microsoft® .NET Framework" tiene bibliotecas administradas que permiten el acceso a Direct2D y DirectWrite.

http://code.msdn.microsoft.com/WindowsAPICodePack

Actualizar

Mientras que los contenedores de DirectX están escritos en C ++ administrado, producen bibliotecas administradas. Por el aspecto de las cosas, estas pueden usarse desde C #. Parece que hay muchos ejemplos incluidos en la descarga que hacen exactamente esto, es decir, usan las librerías C ++ Direct wrapper administradas desde C #.

Utilizar las características de Windows 7 en mi propia aplicación C # sería muy agradable, así que actualmente estoy instalando el SDK de Window7 (para poder construir la solución administrada de DirectX de C ++) y le daré un golpe completo.

Estoy siguiendo las instrucciones en:

http://blogs.msdn.com/msaleh/archive/2009/08/25/introducing-directx-features-of-windows-api-code-pack.aspx

Actualización 2

Siguiendo las instrucciones en el enlace anterior, compilé las bibliotecas administradas de C ++ y puedes usarlas desde C # muy fácilmente.

Ahora no estoy seguro si entiendo correctamente, pero ¿está buscando alguna forma de usar Direct2D y DirectWrite desde C #, o tiene que ser COM o P / Invoke?

Dudo mucho que haya un contenedor COM, ya que es una tecnología no coincidente. COM no está realmente bien diseñado para el tipo de patrones de llamada de método de alta frecuencia que obtienes en la programación de gráficos, es demasiado lento.

Si realmente desea hacer P / Invoke, siempre puede mirar los archivos de encabezado de DirectX (en el SDK de Windows 7) y usar una herramienta para crear todos sus talones de llamadas P / Invoke, por ej.

http://www.pinvoker.com/

Sin embargo, ese sería probablemente un gran PITA para desarrollar una envoltura de esta manera.


Hay un proyecto en codeplex que proporciona envoltorios administrados para Direct2D. No tengo idea si es bueno, pero lo más probable es que el código fuente lo ayude a comenzar.

http://direct2dsharp.codeplex.com/


Lo tengo. No puede crear los objetos directamente, pero d2d1.dll contiene una exportación llamada D2D1CreateFactory que devuelve una interfaz ID2DFactory . Al usar esto, puede implementar un contenedor Direct2D sin Managed C ++.

public static class Direct2D1Util { public const string IID_ID2D1Factory = "06152247-6f50-465a-9245-118bfd3b6007"; [DllImport("d2d1.dll", PreserveSig = false)] [return: MarshalAs(UnmanagedType.Interface)] private static extern object D2D1CreateFactory(D2D1_FACTORY_TYPE factoryType, [MarshalAs(UnmanagedType.LPStruct)] Guid riid, D2D1_FACTORY_OPTIONS pFactoryOptions); public static ID2D1Factory CreateFactory() { D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS(); object factory = D2D1CreateFactory( D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED, new Guid(IID_ID2D1Factory), opts); return (ID2D1Factory)factory; } }

No d2d1.h todos los tipos, porque están todos definidos en d2d1.h , pero aquí se explica cómo usar el código para obtener una fábrica:

ID2DFactory factory = Direct2D1Util.CreateFactory();

Asegúrese de que su interfaz ID2DFactory tenga los atributos apropiados Guid e InterfaceType(ComInterfaceType.InterfaceIsIUnknown) .