Getting ref parameter from COM with InvokeMember call

901 Views Asked by At

I am trying to call a method of a COM server using InvokeMember. The method has the following signature:

            void InsUpdOpInstance(
                        [in] long inIdOperDescr, 
                        [in] long inIsWait, 
                        [in] VARIANT stVariables, 
                        [in] long inIdProc, 
                        [in, out] VARIANT* inIdOperInst, 
                        [out] VARIANT* inReturnCode, 
                        [out] VARIANT* stErrorMessage);

My problem is getting back inIdOperInst parameter value. The following code does not work:

var parameters = new object[] {12,0,"test",25655,DBNull.Value,null,null};
ParameterModifier modifier = new ParameterModifier(parameters.Length);
modifier[4] = true;
modifier[5] = true;
modifier[6] = true;

var ret = WFType.InvokeMember("InsUpdOpInstance",BindingFlags.InvokeMethod,null,Server,parameters,new ParameterModifier[]{modifier},null,null);

After the call parameters[4] does not change the value

Following code working fine:

dynamic serv = Server;

object inError = null;
object stError = null;
object inId = DBNull.Value;
serv.InsUpdOpInstance(12,0,"test",25655,ref inId,out inError,out stError);

After calling the parameter inId value was changed
Why InvokeMember doesn't work?

1

There are 1 best solutions below

0
On

Following code working fine:

var parameters = new object[] {12,0,"test",25655,new System.Runtime.InteropServices.VariantWrapper(DBNull.Value),null,null};
ParameterModifier modifier = new ParameterModifier(parameters.Length);
modifier[4] = true;
modifier[5] = true;
modifier[6] = true;

var ret = WFType.InvokeMember("InsUpdOpInstance",BindingFlags.InvokeMethod,null,Server,parameters,new ParameterModifier[]{modifier},null,null);

The fix is wrapping ref parameter to System.Runtime.InteropServices.VariantWrapper class