есть некоторое дополение для вызова COM объектов — если вызываемый метод использует разные схемы передачи параметров, то необходимо построить массив ParameterModifier. документации на этот массив очень мало (если есть у кого ссылка, поделитесь, пожалуйста), но схема такая:
строится массив из одного элемента:
ParameterModifier[] pm=new ParameterModifier[1];
этот элемент описывает, как передавать параметы в метод
pm[0]=new ParameterModifier(3);
в этом примере 3 — количество передаваемых параметров:
pm[0][i]=true; // i-й параметр передается по ссылке (ByRef)
pm[0][i]=false; // i-й параметр передается по значению (ByVal)
законченный кусок кода — открытие ADODB connection, выполнение команды и закрытие.
Execute метод возвращает RecordsAffected, который нужно передать по ссылке
Type ct=Type.GetTypeFromProgID("ADODB.Connection");
object cn=Activator.CreateInstance(ct);
string cs="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\temp\\db1.mdb;",
user="Admin",
pswd="",
sqls="update [Table4] set mTx='56gh99'";
int recs=0, opts=-1;
ct.InvokeMember("Open", BindingFlags.InvokeMethod, null, cn, new object[]{cs, user, pswd});
object[] pars=new Object[]{sqls, recs, opts};
// список для передачи по ссылка/значение
// для COM всегда массив из одного элемента
ParameterModifier[] pm=new ParameterModifier[1];
// построить описатель передаваемых параметров
// в вызываемый метод: 3 параметра
pm[0]=new ParameterModifier(3);
pm[0][0]=false; // by val : ConnectionString
pm[0][1]=true; // by ref : RecordsAffected
pm[0][2]=false; // by val : Options
ct.InvokeMember("Execute", BindingFlags.InvokeMethod, null, cn, pars, pm , null, null);
recs=Convert.ToInt32(pars[1]);
ct.InvokeMember("Close", BindingFlags.InvokeMethod, null, cn, new object[]{});
Marshal.ReleaseComObject(cn);