لماذا لا تستخدم Direct2D و DirectWrite كائنات COM التقليدية؟

StackOverflow https://stackoverflow.com/questions/2837868

سؤال

أنا أتعامل مع محرك لعبة ثنائية الأبعاد صغيرة في C# وقررت استخدام Direct2D و DirectWrite لتقديمها. أعلم أن هناك حزمة رمز Windows API و Slimdx ، لكنني أود حقًا أن أحفر وكتابة واجهة من نقطة الصفر. أحاول القيام بذلك دون إدارة C ++ ، ولكن لا يبدو أن Direct2D و DirectWrite يستخدمان كائنات COM التقليدية. يحددون واجهات مستمدة من IUnknown, ، ولكن يبدو أنه لا توجد طريقة لاستخدامها فعليًا من C# مع com interop. هناك IIDs في d2d1.h, ، ولكن لا clsid.

بالطبع ، أنا جديد حقًا على com interop ، لذلك ربما أفتقد شيئًا ما. هل يمكن لأحد أن يلقي بعض الضوء على هذا الموقف؟

هل كانت مفيدة؟

المحلول

فهمتك. لا يمكنك إنشاء الكائنات مباشرة ، ولكن d2d1.dll يحتوي على تصدير يسمى D2D1CreateFactory هذا يعيد ID2DFactory واجهه المستخدم. باستخدام هذا ، يمكنك تنفيذ WRAPPER DIRECT2D دون إدارة 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;
    }
}

لن أدرج جميع الأنواع ، لأنها محددة جميعًا d2d1.h, ، ولكن إليك كيفية استخدام الكود للحصول على مصنع:

ID2DFactory factory = Direct2D1Util.CreateFactory();

تأكد الخاص بك ID2DFactory الواجهة لديها مناسبة Guid و InterfaceType(ComInterfaceType.InterfaceIsIUnknown) صفات.

نصائح أخرى

تمكنت "Windows® API Code Pack لـ Microsoft® .NET Framework" من المكتبات التي تتيح الوصول إلى Direct2D و DirectWrite.

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

تحديث

بينما تتم كتابة أغلفة DirectX في C ++ المدارة ، فإنها تنتج مكتبات مُدارة. بمظهر الأشياء يمكن استخدامها من C#. يبدو أن هناك الكثير من الأمثلة المدرجة في التنزيل الذي يقوم بذلك بالضبط ، أي استخدام مكتبات Wrapper Direct المدارة من C#.

سيكون استخدام ميزات Windows 7 في تطبيق C# الخاص بي أمرًا رائعًا للغاية ، لذلك أقوم حاليًا بتثبيت Window7 SDK (حتى أتمكن من إنشاء حل C ++ DirectX المدار) وسأعطي كل شيء باش.

أنا أتابع التعليمات في:

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

تحديث 2

باتباع الإرشادات الواردة في الرابط أعلاه ، حصلت على تجميع مكتبات C ++ المدارة ويمكنك بالفعل استخدامها من C# بسهولة بالغة.

الآن لست متأكدًا مما إذا كنت أفهم بشكل صحيح ، لكن هل تبحث فقط عن طريقة لاستخدام Direct2D و DirectWrite من C#، أو هل يجب أن تكون com أو p invoke.

أشك بشدة في أنه سيكون هناك غلاف كوم ، لأنها تقنية غير متطابقة. لم يتم تصميم COM جيدًا لنوع من أنماط استدعاء طريقة التردد العالي التي تحصل عليها في برمجة الرسومات - إنها طريقة بطيئة للغاية.

إذا كنت ترغب حقًا في القيام بـ p invoke ، يمكنك دائمًا النظر إلى ملفات رأس DirectX (في Windows 7 SDK) واستخدم أداة لإنشاء جميع كبار المكالمات ، على سبيل المثال ، على سبيل المثال

http://www.pinvoker.com/

من المحتمل أن يكون هذا بيتا رئيسيًا لتطوير غلاف بهذه الطريقة.

يوجد مشروع على CodePlex يوفر مغلفة مُدارة لـ Direct2D. ليس لدي أي فكرة عما إذا كان ذلك جيدًا ، ولكن على الأرجح ، سيساعدك الرمز المصدري على البدء.

http://direct2dsharp.codeplex.com/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top