AutoCAD.NET二次开发:创建自定义菜单的两种方法比较

时间:2024-01-18 11:39:32

目前我已经掌握的创建CAD菜单方法有两种:

COM方式:

http://www.cnblogs.com/bomb12138/p/3607929.html

CUI方式:

http://www.cnblogs.com/bomb12138/p/3600842.html

  从程序复杂度来看,COM方式更简单一些,CUI方式较复杂。

  从版本特性来看,COM方式更通用一些,CUI方式仅支持CAD2007+的版本。

  从兼容性来看,基本一样;在测试程序中,对于CUI方式,我引用的是CAD2008的类库,而最后生成的程序也可以在CAD2007中正常运行;而对于COM方式,这里要介绍一下CAD提供的COM组件了。CAD的COM组件基本上是每三年一个系列,比如04、05、06提供的是V16系列,07、08、09是V17系列,每个系列中仅注册最高版本的COM组件,比如我电脑上安装离CAD2007和CAD2008,但是仅注册了CAD2008的组件,高版本的COM可以兼容低版本。在我的测试程序中,引用的是AutoCAD 2008 Type Library,起初引用属性中的“复制本地”为False,这个时候生成的DLL拿到了虚拟机中测试,出现了以下情况:

  在虚拟机A中,仅安装了AutoCAD 2007,用CAD加载我的DLL,会崩溃,提示找不到程序集。

  在虚拟机B中,仅安装了AutoCAD 2009,用CAD加载我的DLL,运行正常。

  之后,我把引用属性中的“复制本地“改为了True,把我的DLL和引用到的Autodesk.AutoCAD.Interop.dll一起复制到两个虚拟机中,都可以正常运行。

  因此,在编译CAD程序时,如果在创建项目时,引用每个系列中的最低版本类库,则理论上,生成的DLL可以兼容三个版本。

  从自动加载实现来看,COM方式配合注册表控制、IExtensionApplication接口实现可以很好地实现菜单的自动加载;而CUI必须用cuiload命令进行加载,所以要实现其自动加载,必须在IExtensionApplication接口中向CAD发送lisp命令来调用cuiload(网上到处都说可以用这种方法实现,但是我不停在尝试,从来未成功,所以不得不怀疑其可行性)。

  最终个人认为,还是Com方式较优,虽然这样一来,需要为每个版本的CAD都发布一次程序(因为引用到了COM),但也许我们的程序里还有其他地方会用到COM呢。

  而且事实上,我们仅需要一套代码,通过为每个版本的CAD创建一个项目,然后将代码以链接的方式加载到项目中,就可以很方便地发布不同版本的程序集了。如果程序中在些地方不同版本CAD中的写法支持不一样的话,可以用预编译指令进行控制。

  以链接方式加载代码的方式如下:

  在项目中点鼠标右键,选择“添加现有项”,然后选中要添加的代码文件,点“添加”按钮旁的向下箭头,即可找到“添加为链接”,以这种方式添加的代码文件像桌面快捷方式一样左下角有个箭头。

  AutoCAD.NET二次开发:创建自定义菜单的两种方法比较