单元测试时Solidworks程序集引用版本冲突问题问询
解决方案
问题根源
两个报错分别对应两类常见的SolidWorks二次开发版本适配问题:
- 引用新版SolidWorks dll时报
FileNotFoundException:业务项目依赖Nuget中的28.1.0.74版本Interop程序集,默认程序集加载规则要求版本完全匹配,因此运行时会主动查找旧版本程序集。 - 引用Nuget旧版dll时报
REGDB_E_CLASSNOTREG错误:Interop dll只是SolidWorks COM组件的托管包装层,实际逻辑实现依赖本机安装的SolidWorks COM服务,你本机只注册了新版SolidWorks的COM组件,旧版本对应的COM类不存在,因此创建实例失败。
推荐处理方案
方案1:配置程序集绑定重定向(最优解,不影响现有环境)
SolidWorks的COM接口完全向前兼容,旧版Interop的调用可以正常转发到新版COM组件上,这也是你主项目能正常运行的核心原因,仅需要给测试项目补充绑定重定向配置即可:
- 在测试项目中引用本机安装的新版SolidWorks Interop程序集,右键打开引用属性,将「特定版本」设置为False
- 打开测试项目的
app.config文件(无该文件则新建应用程序配置文件),在<runtime>节点下添加如下配置:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="SolidWorks.Interop.sldworks" publicKeyToken="7c4797c3e4eeac03" culture="neutral" /> <!-- 将newVersion替换为你本机实际安装的SolidWorks Interop的版本号 --> <bindingRedirect oldVersion="0.0.0.0-29.1.0.100" newVersion="29.1.0.100" /> </dependentAssembly> <!-- 若项目还引用了SolidWorks.Interop.swconst、SolidWorks.Interop.swmotionstudy等其他Interop程序集,按上述格式同步添加重定向即可 --> </assemblyBinding> </runtime>
方案2:单元测试逻辑解耦(长期优化方案)
如果不需要测试SolidWorks本身的API逻辑,仅需要测试业务代码,可以通过架构优化彻底规避版本问题:
- 对业务代码中调用SolidWorks API的逻辑做接口抽象,通过依赖注入的方式传入抽象接口实例
- 单元测试时使用Mock框架伪造接口实现,不需要真实启动SolidWorks进程,同时大幅提升测试运行速度。
关于手动注册旧版dll的说明
完全不建议执行该操作:
- 单独注册旧版Interop dll无效:Interop只是COM组件的代理包装,没有对应版本的SolidWorks主程序安装,依旧找不到对应的COM实现类,无法解决
REGDB_E_CLASSNOTREG报错。 - 强行安装旧版SolidWorks并注册会覆盖本机COM注册表信息,导致所有依赖新版SolidWorks的软件、插件无法正常运行,严重破坏现有开发环境。
内容的提问来源于stack exchange,提问作者Eric Snyder
相关产品推荐
相关产品推荐

