سؤال

أنا أستخدم com interop. لدي مكالمة في VB6 التي تُرجع سلسلة من 13000 Chars تقريبًا. إذا قمت بتنفيذ المكالمة في VB6 Pure ، فسيستغرق تنفيذ حوالي 800 مللي ثانية. إذا قمت بتنفيذها عبر C# و COM Interop ، فسيستغرق الأمر حوالي 8 ثوانٍ. أفترض أن التأخير ناتج عن التنقل.

إذا كنت محقًا في التنظيم ، فسأكون ممتنًا إذا كان بإمكان شخص ما اقتراح أسرع طريقة يمكنني الحصول على هذا في C#. على سبيل المثال ، سيكون من الأفضل أن تعرضه كصفيف بايت ب) توفير سلسلة BYREF في طبقة VB6

سأكون أقدر بعض رمز العينة كذلك. حاولت

Marshal.PtrToStringAuto(Marshal.ReadIntPtr(myCOMObject.GetString, 0)

ولكن دون جدوى.

--

متابعة من تعليق فرانسي. أنا ببساطة أشير إلى VB6 DLL (لذلك في العملية) من C# DLL. إليك مستخلص من Oleview

interface _MyCOMObect : IDispatch {
        ...
        [id(0x60030006)]
        HRESULT GetString(
                        [in] _IEventHistory* p_oEventHistory, 
                        [out, retval] _IXML** );
        ...
    };

    [
      uuid(09A06762-5322-4DC1-90DD-321D4EFC9C3E),
      version(1.0),
        custom({17093CC6-9BD2-11CF-AA4F-304BF89C0001}, "0")
    ]
    coclass MyCOMObject {
        [default] interface _CFactory;
    };

    [
      odl,
      uuid(C6E7413F-C63A-43E4-8B67-6AEAD132F5E5),
      version(1.0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]

ربما يجب أن أشير إلى أن المعلمة (p_oeventhistory) هي كائن com آخر أقوم بتثبيته في C# لكن هذا يستغرق حوالي 80 مللي ثانية

س

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

المحلول

شيئين: -

  1. VB6 الخاص بي هو صدئ بعض الشيء ، لكن مقتطفات IDL الخاصة بك تشير إلى أن طريقة GetString تُرجع فعليًا كائنًا يقوم بتنفيذ واجهة IXML. أنا مندهش نوعًا ما من أن المارشال. هل يمكنك تغيير VB6 بحيث تقوم بالفعل بإرجاع شيء من النوع؟

  2. تأثير com+ هو احتمال هائل. أولاً ، أود أن أقترح أن تقارن توقيت الاحتجاج الأول مقابل الاحتجاج اللاحق. سيحتاج COM+ إلى تدوير عملية المضيف لمكون VB6 الخاص بك في المرة الأولى التي يتم فيها استدعاءها ، لذا فإن المكالمة الأولى تكون دائمًا أكثر إيلامًا. لاحظ أن هذا يحدث في الاحتجاج الأول ، وليس على إنشاء مثيل للكائن. ثانياً ، الطريقة التي يتم بها تكوين المكون الخاص بك في com+ يمكن أن تحدث فرقًا كبيرًا أيضًا ؛ إذا قمت بتعطيل جميع خدمات COM+ التي لا تحتاجها فعليًا (مثل المعاملات) ، فقد تتمكن من إزالة بعض منطق الاعتراض الذي يضعه COM+ حول جميع دعوات الطريقة. في النهاية ، إذا لم تكن بحاجة إلى الخدمات التي توفرها com+ ، فلا تستخدمها.

نصائح أخرى

سأفكر في استخدام الملفات المعينة الذاكرة أو تسمي الأنابيب.

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