Dav*_*own 4 .net c# com direct2d directwrite
我正在使用C#中的一个小型2D游戏引擎,并决定使用Direct2D和DirectWrite进行渲染.我知道有Windows API Code Pack和SlimDX,但我真的很喜欢从头开始编写接口.我试图在没有托管C++的情况下这样做,但Direct2D和DirectWrite似乎没有使用传统的COM对象.它们定义了派生自的接口IUnknown,但似乎没有办法从C#与COM互操作实际使用它们.有IID d2d1.h,但没有CLSID.
当然,我是COM互操作的新手,所以也许我只是缺少一些东西.有人可以对这种情况有所了解吗?
得到它了.您不能直接创建对象,但d2d1.dll包含一个D2D1CreateFactory返回ID2DFactory接口的导出.使用它,您可以实现没有托管C++的Direct2D包装器.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我不会包含所有类型,因为它们都已定义d2d1.h,但这里是如何使用代码来获取工厂:
ID2DFactory factory = Direct2D1Util.CreateFactory();
Run Code Online (Sandbox Code Playgroud)
确保你的ID2DFactory接口有适当的Guid和InterfaceType(ComInterfaceType.InterfaceIsIUnknown)属性.
"适用于Microsoft®.NETFramework的Windows®API代码包"具有允许访问Direct2D和DirectWrite的托管库.
http://code.msdn.microsoft.com/WindowsAPICodePack
虽然DirectX包装器是用托管C++编写的,但它们可以生成托管库.根据事物的外观,这些可以从C#中使用.下载中包含的大量示例正是如此,即使用C#中的托管C++ Direct包装器库.
在我自己的C#应用程序中使用Windows 7功能会非常好,所以我目前正在安装Window7 SDK(这样我就可以构建托管的C++ DirectX解决方案)并且会给整个事情带来麻烦.
我按照以下说明操作:
按照上面链接中的说明,我得到了托管的C++库,你可以很容易地从C#中使用它们.
现在我不确定我是否理解正确,但是你只是在考虑使用C#中的Direct2D和DirectWrite,或者它必须是COM或P\Invoke.
我非常怀疑会有一个COM包装器,因为它是一种不匹配的技术.对于你在图形编程中获得的那种高频方法调用模式来说COM实际上并没有很好的设计 - 它太慢了.
如果你真的想做P\Invoke,你可以随时查看DirectX头文件(在Windows 7 SDK中)并使用工具创建所有P\Invoke调用存根,例如
这可能是一个主要的PITA虽然以这种方式开发包装.