C# 使用反射调用含 ref 或 out 参数的方法, 以及动态调用ActiveX
//2023.09.05 C# 无法反射ActiveX对象方法, 在明确方法参数的情况下,可采用dynamic动态调用方式。 bool ret = (bool)((dynamic)obj).MethodA("", "",ref inerr,ref str); //程序集引用方式 int int111 = 0; string str111 = ""; bool ret1 = new ClsITestData().GetRtf("Debug_Pas", "022_0714_1654_55", out string rtf, ref int111, ref str111); string msg1 = rtf; //COM调用 string str = ""; Type type = Type.GetTypeFromProgID("ProgIDxxxxxx"); //创建COM类型 object obj = Activator.CreateInstance(type); //创建类型实例 object[] invokeParas = new object[] { "Debug_Pas", "022_0714_1654_55", str, null, null }; //参数对象数组 bool ret2 = (bool)type.GetMethod("GetRtf").Invoke(obj, invokeParas); //Invoke执行 string msg2 = invokeParas[2].ToString(); //取参数值
public static object ProgIDInvoke(string progid, string methodName, ref object[] paras) { Type type = Type.GetTypeFromProgID(progid); object obj = Activator.CreateInstance(type); return type.GetMethod(methodName).Invoke(obj, paras); } public static void ProgIDInvokeVoid(string progid, string methodName, ref object[] paras) { Type type = Type.GetTypeFromProgID(progid); object obj = Activator.CreateInstance(type); type.GetMethod(methodName).Invoke(obj, paras); } public static object ClsIDInvoke(Guid clsid, string methodName, ref object[] paras) { Type type = Type.GetTypeFromCLSID(clsid); object obj = Activator.CreateInstance(type); return type.GetMethod(methodName).Invoke(obj, paras); } public static void ClsIDInvokeVoid(Guid clsid, string methodName, ref object[] paras) { Type type = Type.GetTypeFromCLSID(clsid); object obj = Activator.CreateInstance(type); type.GetMethod(methodName).Invoke(obj, paras); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix