随着NX的版本更新,官方对于开发包也有调整,这时候怎么让我们一份程序能更好的兼容更多的NX版本?
如果是使用C++开发,我们可能需要做条件编译,引用不同版本的库,实现兼容。菜单绑定一个入口,去加载子模块完成界面展示和功能实现。这样会有一个问题
,就是插件DLL的实例太多,不好管理。然后也可以去看看官方对于托管平台是怎么封装的,使用Loadlibrary, GetProcAddress去动态加载对应的接口,
让在一个DLL中能尽可能的做到版本通用,但是这样代码量也比较大,遇到BUG也不好排查。
相比而主Net的开发者就要幸福不少,官方的开发包大部分都是基于适配器的设计模式做的封装,已经帮我们规避了不少这种兼容性问题,
然后开发包 NXOpen.dll,NXOpen.UF.dll ,NXOpen.Utilities.dll 等接口我们都是动态加载的,上层的调用我们是不用去关心它内部的参数是怎么处理的,
比如字符串在不同的版本到底是ANSI 还是UTF8, 但是由于官方功能的更新,还是有特别多的接口有废弃,或者参数和枚举的调整。
这时候我们就需要通过反射去动态的设置属性和枚举值。

以上是同步建模中的枚举参数在两个版本中的定义。比如CsysToCsys这个项,如果我们通过 NXOpen.GeometricUtilities.ModlMotion.Options.CsysToCsys;
在代码中静态的设置,经过运行时编译在不同的版本中它可能就被指向到不同的值。导致构造器产生了错误的输出。
这时候我们如果通过反射,加载指定名称的枚举值,动态的设置到对应的属性上就没有问题了,不同的版本都能正确的输出。


而对于方法的调整,我们也需要通过反射去加载指定名称的方法,然后Invoke调用,例如STEP的转换构造器在不同的版本中它的创建接口就有调整。


有时候对于接口有大量的调整时,特别对于类的字段层级太深时,这样也不够优雅。这时候我们就可以请出Net中一个非常重要的利器Dynmaic,
在开发中对于使用NXOpen接口的时候,我们大多时候都是先去录制一下JA,然后找到关键属性封装成我们需要的方法。对于这种接口有改动时,
Dynamic 能非常轻松的实现我们需要的兼容性调整。
例如在运动仿真中,接触约束在高版本中已经由低版本的SelectObjectList转换成的单例的实现。以上改动通过反射也能完成兼容性的调整,
但是代码量稍大。而用Dynamic 一个分支搞定。

需要注意的时,如果引用Dynamic支持,需要引用框架的 Microsft.CSharp 库
