反射获取out值已经有一个帖子了帮忙解决俩个分都是你的,多谢

反射获取out值已经有一个帖子了帮忙解决俩个分都是你的,谢谢
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作者的说明。