عند استدعاء واجهة مكون COM، نستخدم بشكل عام طريقة Type.InvoceMember(). يحتاج Type.InvoceMember() إلى قبول مصفوفة من النوع Object لتمرير معلومات معلمات الواجهة عند استدعائها. بالنسبة لمعلمات الواجهة التي تحتوي فقط على [in] أو ByVal، ما عليك سوى إنشاء مثل هذا المصفوفة وتمريرها إلى Type.InvoceMember().
إذا كانت معلمات الواجهة لمكون COM تحتوي على معلمات إرجاع [خارج] أو [داخل، خارج] (تم تطوير ByRef في مكونات COM في VB)، فبالإضافة إلى الطريقة المذكورة أعلاه، يجب القيام ببعض الأعمال الإضافية. يجب عليك إخبار Type.InvoceMember() بالمعلمات الموجودة في معلمات الواجهة التي هي [in] [in, out] أو معلمات ByRef، وإلا فلن تحصل على أي قيمة لمعلمة الإرجاع. من أجل الحصول على قيمة معلمة الإرجاع [in] [in، out] أو ByRef، يجب عليك استخدام أسلوب Type.InvoceMember () المحمل بشكل زائد والذي يحتوي على صفيف ParameterModifier.
يحتاج مصفوفة ParameterModifier إلى احتواء عنصر واحد فقط. يحتوي كائن ParameterModifier على خاصية فهرس تسمى Item لمعلمة الاستدعاء. في واجهة الاستدعاء، إذا كانت المعلمة Nth هي معلمة مرجعية، فيجب تعيين قيمة true لخاصية العنصر Nth لإخبار Type.InvoceMember() بأن هذه معلمة مرجعية.
ما يلي هو مثال C# لاستدعاء واجهة COM مع ثلاثة معلمات (اثنتان منها معلمات مرجعية). في هذا المثال، تعد المعلمة الثانية والمعلمة الثالثة معلمتين مرجعيتين:
اكتب ComObjType;
كائن ComObj؛
سلسلة ReturnValue
// إنشاء مرجع لكائن COM
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
// إنشاء مصفوفة معلمات لاستدعاء InvocMethod وتهيئة كل عنصر معلمة
object[] ParamArray = new object[3];
ParamArray [0] = "InParam" ;
ParamArray[1] = 5;
ParamArray[2] = "" ;
// إنشاء مصفوفة ParameterModifier (لاحظ أن هناك عنصرًا واحدًا فقط في مصفوفة ParameterModifier المذكورة أعلاه)
// هناك ثلاث معلمات هنا. ولذلك، عند إنشاء كائن ParameterModifier، يجب عليك الإشارة إلى عدد المعلمات في منشئه.
// استخدم سمة الفهرس للمعلمة للإشارة إلى المعلمة التي تم إرجاعها
// ليست هناك حاجة لتحديد المعلمات الموجودة [في] أو ByRef.
ParameterModifier[] ParamMods = new ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3); // تمت التهيئة لعدد معلمات الواجهة
ParamMods[0][1] = true; // قم بتعيين المعلمة الثانية كمعلمة الإرجاع
ParamMods[0][2] = true; // قم بتعيين المعلمة الثالثة كمعلمة الإرجاع
// استدعاء الوظيفة المحملة بشكل زائد والتي تحتوي على صفيف ParameterModifier
ReturnValue = (string) ComObjType.InvoceMember("ReturnSomeValues"، // اسم وظيفة الواجهة BindingFlags.Default | BindingFlags.InvocMethod,
باطل،
ComObj, // مكون COM المسمى ParamArray، // صفيف المعلمات ParamMods، // صفيف ParameterModifier يحدد معلمة الإرجاع فارغة،
فارغة)؛
// عرض قيمة المعلمة
Console.WriteLine ("Param1 = {0}"، ParamArray[0]) ;
Console.WriteLine ("Param2 = {0}"، ParamArray[1]) ;
Console.WriteLine ("Param3 = {0}"، ParamArray[2]) ;
Console.WriteLine ("Return Value = {0}"، ReturnValue ) ؛
لاحظ أنه من أجل تمرير صفيف ParameterModifier الصحيح إلى InvoceMethod()، يجب عليك تهيئة نوع بيانات المعلمة في صفيف المعلمة الذي يقبل الإرجاع. في المثال أعلاه، المعلمة الثانية هي عدد صحيح [5]، والمعلمة الثالثة عبارة عن نص [''].