Autodesk Inventor API AddButtonDefinition测试与开发环境表现差异问询
可能的异常原因
- 跨进程COM封送问题:如果你的测试是启动独立的Inventor进程(进程外COM实例)调用API,
PictureDispConverter生成的IPictureDisp对象持有的是测试进程的GDI句柄,跨进程封送到Inventor进程时无法被正确识别,直接传入无效句柄触发了未预期错误。而AddIn运行时是直接在Inventor进程内创建IPictureDisp对象,不存在跨进程封送问题。 - 线程模型不匹配:Inventor UI相关的COM接口要求运行在STA(单线程单元)线程下,MsTest默认的测试线程为MTA(多线程单元),在MTA线程下生成的
IPictureDisp对象本身就是无效的,传入API后直接触发异常。 - 资源加载上下文不一致:测试环境下程序集被测试宿主进程加载,
InvAddIn.Properties.Resources的资源查找上下文和AddIn在Inventor进程内运行时不同,可能读取到空资源或者损坏的资源对象,转换出的IPictureDisp为空或者无效。 - API上下文限制:
AddButtonDefinition设计上只允许在AddIn正常激活的上下文下传入自定义图标,测试场景下没有走完整的AddIn注册、激活流程,Inventor的权限校验不允许传入外部图标资源。
排查思路
- 验证
IPictureDisp有效性:在测试代码中生成icon16后,先尝试调用该对象的基础方法(如get_Width/get_Height),确认转换后的对象本身是否可用,如果调用时就抛异常,说明问题出在图标转换阶段。 - 调整测试线程模型:给测试方法添加
[STATestMethod]特性(MsTest 2及以上版本支持),强制测试运行在STA线程下,匹配Inventor COM的线程要求。 - 验证资源读取有效性:在测试代码中单独读取
InvAddIn.Properties.Resources.cp_logo_16x16资源,将其保存为本地图片文件,确认测试环境下资源可以被正常读取,排除资源未嵌入程序集、读取为空的问题。 - 替换图标生成逻辑:在测试代码中手动创建一个纯色的16*16 Bitmap对象,再用
PictureDispConverter转换为IPictureDisp传入API,如果不再报错,说明原有项目资源在测试上下文的加载逻辑存在问题。 - 调整测试运行方式:不要在测试代码中直接调用函数,改为将测试逻辑嵌入AddIn的
OnActivation入口,走正常的AddIn激活流程后触发测试,验证是否是上下文限制导致的问题。 - 排查GDI资源权限:测试运行时检查当前进程的GDI对象计数,确认没有出现GDI资源泄露导致的句柄无效问题,同时尝试以管理员权限运行测试进程,排除权限不足导致的资源访问失败。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

