solidworks插件 执行回调这个参数是string是怎么变成方法的
好问题!让我查看一下这个字符串是如何被 SolidWorks 解析并调用到实际方法的。
现在我明白了!让我解释一下这个字符串是如何变成方法调用的:
关键机制:SolidWorks 的回调函数解析
这个字符串参数"FunctionProxy(1002)"能够被 SolidWorks 识别并调用,关键在于第66 行的代码:
swApp.SetAddinCallbackInfo(0,this,addinCookieID);工作原理:
设置回调上下文(
addin.cs第 66 行)SetAddinCallbackInfo告诉 SolidWorks:“这个插件对象(this)上有可以调用的方法”- 参数
this就是AddinStudy实例,它是ISwAddin的实现类
字符串格式约定
- SolidWorks 使用 .NET 的反射机制来解析这个字符串
- 格式:
"方法名 (参数)" - 当用户点击菜单时,SolidWorks 会:
- 解析字符串得到方法名
FunctionProxy和参数"1002" - 在插件对象(
AddinStudy)上查找匹配的公共方法 - 调用该方法并传入参数
- 解析字符串得到方法名
方法签名要求
publicvoidFunctionProxy(stringdata)// 必须是 public,接受 string 参数{intcommandId=int.Parse(data);if(_commandRegistry.TryGetValue(commandId,outvarmethod)){method.Invoke(this,null);// 通过反射调用实际的方法}}完整的调用链
用户点击菜单 → SolidWorks 解析 "FunctionProxy(1002)" → 调用 AddinStudy.FunctionProxy("1002") → FunctionProxy 解析出 commandId=1002 → 从 _commandRegistry 字典中找到对应的 MethodInfo → 通过 reflection.Invoke() 调用实际的 Drw2Dwg() 或 NewDrw() 方法
为什么需要这样设计?
这是 SolidWorks API 的设计模式:
- 命令注册时:提供方法名字符串(编译时无法验证)
- 命令执行时:SolidWorks 通过反射动态调用
- 优势:支持运行时动态修改命令行为
- 劣势:没有编译时检查,容易拼写错误
类似的回调字符串还有:
"EnableFunction(1002)"- 用于检查命令是否可用- 对应方法:
public int EnableFunction(string data)
这就是 SolidWorks COM 插件系统的标准回调机制!
