ref和指针不是object,甚至不能box,所以不行了。
前些时候我也很为这个问题急了一把,这里是我的发现:
使用这个InvokeMember的overload版本:
[C#]
public abstract object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args,
ParameterModifier[] modifiers,
CultureInfo culture,
string[] namedParameters
);ParameterModifier pmod = new ParameterModifier(1);
pmod[0] = false; //in
pmod[1] = true; //out
t.InvokeMember(funname, BindingFlags.InvokeMethod, null, obj, args,
new ParameterModifer[] {pmod}, null, null);
//args数组中仍然放一个string对象。MSDN上对ParameterModifier语言不详,还是自己多试试看吧。
前些时候我也很为这个问题急了一把,这里是我的发现:
使用这个InvokeMember的overload版本:
[C#]
public abstract object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args,
ParameterModifier[] modifiers,
CultureInfo culture,
string[] namedParameters
);ParameterModifier pmod = new ParameterModifier(1);
pmod[0] = false; //in
pmod[1] = true; //out
t.InvokeMember(funname, BindingFlags.InvokeMethod, null, obj, args,
new ParameterModifer[] {pmod}, null, null);
//args数组中仍然放一个string对象。MSDN上对ParameterModifier语言不详,还是自己多试试看吧。
HRESULT getname([in] BSTR name);
HRESULT getname([out] BSTR* name);
上面对于下两个发法都没问题,但对于下面的方法就不能调用了,不止为什么?
HRESULT getname([out, retval] BSTR* name); objType.InvokeMember(funname,
BindingFlags.InvokeMethod,
null,
obj,
args,
new ParameterModifier[] {pmod},
null,
null);
这种方法不行:
报错System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System
Reflection.TargetParameterCountException: 无效索引。
--- 内部异常堆栈跟踪的结尾 ---
at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr,
Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[]
namedParameters)
at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Bin
er binder, Object target, Object[] args, ParameterModifier[] modifiers, Culture
nfo culture, String[] namedParameters)
at server.startthread()
不要参数,接InvokeMember的返回值看看。