When using Refection against .NET codebyref just works as you would expect it to. When you are reflecting against COM byref does not work as you may expect.
If the target is .NET the following code would just work. The fact that we are creating the object from a class ID tells us it’s COM, so it won’t work.
var addin = GetCOMObject();
object[] objparams = new object[] { intVal,stringVal,etc};
var addintype = Type.GetTypeFromCLSID(new Guid("ADADAF30-E012-45db-95BE-E7544E918EBD")); // An Outlook Addin
var rval = addintype.InvokeMember(methodname, BindingFlags.InvokeMethod, null,addin, objparams);
Assume the method that we are invoking passes something back byref to param 2. The following code will not work show you the value :
stringval = (string) objparams[1];
To make this work with COM, you need to use ParameterModifers.
So, your code will look like
var addin = = GetCOMObject();
object[] objparams = new object[] { intVal,stringVal,etc};
ParameterModifier mods = new ParameterModifier(_params.Length);
mods[1] = true; // param 2 passes back by ref
ParameterModifier[] modstopass = { mods }; // we need an array
var addintype = Type.GetTypeFromCLSID(new Guid("ADADAF30-E012-45db-95BE-E7544E918EBD"));
var rval = addintype.InvokeMember(methodname, BindingFlags.InvokeMethod, null, addin, objparams, modstopass, null, null);
We had this issue with a C# Add-in for Outlook.
Let’s hope this “just works” with C#4 and the dynamic type. ..
No comments:
Post a Comment