反射获取out值已经有一个帖子了帮忙解决俩个分都是你的,多谢
反射获取out值已经有一个帖子了帮忙解决俩个分都是你的,谢谢
http://bbs.****.net/topics/390965752?page=1#post-398761799
object result = comObj.GetType().InvokeMember(_methodName, System.Reflection.BindingFlags.InvokeMethod, null, comObj, param);_methodName这个方法如果是没有out 可以正常执行,我想的是能不能既能执行带out参数,并且正常返回值,也能执行不带out参数的方法。谢谢
------解决思路----------------------
http://www.cnblogs.com/cxd4321/p/3368726.html
参考一下这个帖子
------解决思路----------------------
反射调用COM方法要支持out需要用到ParameterModifier,可以参考这个问题里面的解决方案。
不过如果你想支持所有情况,我估计很麻烦,可能需要用到那个DispatchUtility里面的GetType转换成.net这边的Type,才能知道哪些是out的参数。不过这个转换不一定能返回所有方法,而且会很慢。或者你自己做好一个方法名对应out参数位置的列表,查表来设置ParameterModifier。
PS:你的DispatchUtility是来自http://bbs.****.net/topics/390937744吧?我想对你说:作为程序员,请学会“科学上网”。也最好再看下我23楼那个链接里DispatchUtility作者的说明。
http://bbs.****.net/topics/390965752?page=1#post-398761799
if (args.Length == 0)
{
return;
}
#region 执行方法
//获取方法名
string _methodName = args[0];
//创建list集合用于保存参数
List<object> list = new List<object>();
for (int i = 1; i < args.Length; i++)
{
if (i == args.Length - 1)
{
CResultType _CResultType = new CResultType();
if (_CResultType.GetResultType(args[i].ToString()) != null)
{
list.Add(_CResultType.GetResultType(args[i].ToString()));
continue;
}
}
list.Add(args[i]);
}
//转换成object数组
object[] param = list.ToArray();
//创建类型实例
object comObj = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("30FB1E22-B498-4B62-8B26-98BA61176024")));
// Type dispatchType = ConsoleApplication1.DispatcuUtitly.DispatchUtility.GetType(comObj, false);
int dispId;
var hr = MSS_ExecuteTool.DispatcuUtitly.DispatchUtility.TryGetDispId(comObj, _methodName, out dispId);
if (hr == false)
{
comObj = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("592703AB-CF61-425D-9ACD-A0938E451AEA")));
if (MSS_ExecuteTool.DispatcuUtitly.DispatchUtility.TryGetDispId(comObj, _methodName, out dispId) == false)
{
comObj = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("2A69EE81-E846-42B5-88E0-EE3DAA0A809A")));
if (MSS_ExecuteTool.DispatcuUtitly.DispatchUtility.TryGetDispId(comObj, _methodName, out dispId) == false)
{
return;
}
}
}
// 获取返回值
object result = comObj.GetType().InvokeMember(_methodName, System.Reflection.BindingFlags.InvokeMethod, null, comObj, param);
CResultType _CResultType1 = new CResultType();
_CResultType1.OutWriteLine(param[param.Length - 1]);
//输出结果
Console.Write(string.Format("result={0}", result));
Console.ReadKey();
object result = comObj.GetType().InvokeMember(_methodName, System.Reflection.BindingFlags.InvokeMethod, null, comObj, param);_methodName这个方法如果是没有out 可以正常执行,我想的是能不能既能执行带out参数,并且正常返回值,也能执行不带out参数的方法。谢谢
------解决思路----------------------
http://www.cnblogs.com/cxd4321/p/3368726.html
参考一下这个帖子
------解决思路----------------------
反射调用COM方法要支持out需要用到ParameterModifier,可以参考这个问题里面的解决方案。
不过如果你想支持所有情况,我估计很麻烦,可能需要用到那个DispatchUtility里面的GetType转换成.net这边的Type,才能知道哪些是out的参数。不过这个转换不一定能返回所有方法,而且会很慢。或者你自己做好一个方法名对应out参数位置的列表,查表来设置ParameterModifier。
PS:你的DispatchUtility是来自http://bbs.****.net/topics/390937744吧?我想对你说:作为程序员,请学会“科学上网”。也最好再看下我23楼那个链接里DispatchUtility作者的说明。