При вызове интерфейса COM-компонента мы обычно используем метод Type.InvokeMember(). Type.InvokeMember() должен принять массив типа Object для передачи информации о параметрах интерфейса при его вызове. Для параметров интерфейса, которые содержат только [in] или ByVal, вам нужно всего лишь создать такой массив и передать его в Type.InvokeMember().
Если параметры интерфейса COM-компонента содержат возвращаемые параметры [out] или [in, out (ByRef в COM-компонентах, разработанных на VB), то помимо описанного выше метода необходимо проделать некоторую дополнительную работу. Вы должны указать Type.InvokeMember(), какие параметры в параметрах интерфейса являются параметрами [in][in,out] или ByRef, в противном случае вы не получите никакого значения возвращаемого параметра. Чтобы получить значение возвращаемого параметра [in][in,out] или ByRef, вам необходимо использовать перегруженный метод Type.InvokeMember(), который содержит массив ParameterModifier.
Массив ПараметрМодификатор должен содержать только один элемент. Объект ПараметрМодификатор имеет индексное свойство Item для вызывающего параметра. Если в вызывающем интерфейсе параметр Nth является ссылочным параметром, то свойству Nth Item должно быть присвоено значение true, чтобы сообщить Type.InvokeMember(), что это ссылочный параметр.
Ниже приведен пример C# вызова COM-интерфейса с тремя параметрами (два из которых являются ссылочными параметрами). В этом примере второй параметр и третий параметр являются ссылочными параметрами:
type ComObjType;
объект ComObj;
string ReturnValue
//Создаем ссылку на COM-объект;
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//Создаем массив параметров для вызова InvokeMethod и инициализируем каждый элемент параметра
объект[] ParamArray = новый объект[3];
ParamArray [0] = "InParam";
ПарамАррай[1] = 5;
ParamArray[2] = "" ;
//Создаем массив ПараметрМодификатор (обратите внимание, что в упомянутом выше массиве ПараметрМодификатор есть только один элемент)
//Здесь три параметра. Поэтому при создании объекта ParameterModifier необходимо указать количество параметров в его конструкторе.
//Используйте атрибут index параметра, чтобы указать, какой параметр является возвращаемым параметром
// Нет необходимости указывать параметры [in] или ByRef.
Модификатор Параметра[] ParamModifiers = новый Модификатор Параметра[1];
ParamMods[0] = новый параметрModifier (3); // Инициализируется количеством параметров интерфейса;
ParamMods[0][1] = true // Устанавливаем второй параметр в качестве возвращаемого параметра;
ParamMods[0][2] = true //Установим третий параметр в качестве возвращаемого параметра;
//Вызов перегруженной функции, содержащей массив параметраModifier
ReturnValue = (строка) ComObjType.InvokeMember("ReturnSomeValues", //Имя функции интерфейса BindingFlags.Default | BindingFlags.InvokeMethod,
нулевой,
ComObj, // Вызываемый COM-компонент ParamArray, // Массив параметров ParamMods, // Массив параметраModifier, задающий возвращаемый параметр null,
null);
//Отображение значения параметра
Console.WriteLine("Param1 = {0}", ParamArray[0]) ;
Console.WriteLine("Param2 = {0}", ParamArray[1]) ;
Console.WriteLine("Param3 = {0}", ParamArray[2]) ;
Console.WriteLine ("Return Value = {0}", ReturnValue ) ;
Обратите внимание, что для передачи правильного массива ModuleModifier в InvokeMethod() необходимо инициализировать тип данных параметра в массиве параметров, который принимает возвращаемый результат. В приведенном выше примере второй параметр — целое число [5], а третий параметр — текст [''].