2013-07-03 1 views
2

Я разрабатываю библиотеки C#, которые мне нужно вызвать из COBOL (неуправляемого) кода. Поэтому я использую COM-взаимодействие для этих целей.COM interop: переменное количество параметров

Я создал слой «ModuleLanucher», который опосредует связь. Я зарегистрировал эту библиотеку ModuleLanucher этими командами:

regasm ModuleLanucher.dll /codebase 
TLBEXP Modulelanucher.dll 

Все работает нормально, если у меня есть конкретное количество параметров в функции Foo. (см. ниже)

К сожалению, для моей функции foo требуется переменное количество аргументов. Это эскиз моего кода:

namespace NMSPC 
{ 
    class ModuleLanucher 
    { 
     void foo(string moduleName, params object[] args) 
     { 
     //call some dlls with args as parameteres 
     } 
    } 
} 

Из COBOL кода я звоню COM функция Foo:

VCCOMServer is class "$OLE$NMSPC.ModuleLanucher" 

invoke VCCOMServer "new" returning anInstance 
invoke anInstance "foo" using MODULENAME, PARAM01, PARAM02, PARAM03, PARAM04 

Когда я пытаюсь вызвать метод Foo из этого COBOL кода, я получаю эту ошибку:

Исключение 65538 не в ловушке класса oleexceptionmanager. Описание: «Несоответствие счетчика OLE-параметров» (8002000E): Недопустимое число параметров

Возможно ли иметь функцию COM-объекта с переменным числом аргументов?

Спасибо за любые предложения

ответ

2

Переменные списки аргументов не поддерживаются COM. Я думаю, что COM часть вашего метода преобразуется в:

void foo(string moduleName, object[] args) //note the missing params... 

Для вызова этого метода из COBOL, вам нужно передать массив объектов в качестве 2-го аргумента.

Если вы знаете максимальные #parms на forehand, альтернативой может быть то, что вы определяете свой метод с помощью этого максимального #parms, где вы указываете их как необязательные для COM.

Отсутствующие параметры передаются как Type.Missing.