- Render module DLL, written in C++ - consists of a class derived from RenderingModule, and a factory function to instantiate the class
- Marshalling DLL, written in C++/CLI - wraps the native RenderModule in a managed interface, dealing with all DLL handling and data marshalling
- UI app, written in C#. Provides the frontend.
Mishtair Hoxley was suggesting that I look into DirectShow for recording the AVIs - I think there's a DirectX.AudioVideoPlayback namespace under .NET that may contain what I want, but if not, I'll either find an alternative way to build the AVI or write another C++/CLI DLL to handle it all. Or maybe build the functionality into the existing one.
C++/CLI really is a horrible language. The fact that you can mix managed and unmanaged code freely is convenient, but that seems to be pretty much its only redeeming quality. I'll be quite happy to keep the marshalling DLL as thin as possible and write all the serious GUI stuff in C#.
One interesting side-effect of the way I've written the RenderModule interface is that there's actually nothing D3D10-specific in the harness itself - the module is just expected to return a pointer to an array of RGB values. The RenderModule can generate those values however it wants - D3D10, D3D9, software rasterizer, random number generator. As such I'll probably test it all using a D3D9 module, allowing me to stick to what I already know, and allowing me to do all dev and testing under XP.