基于COM Interop的AutoCAD二次开发如何在程序内部加载dll文件
前言
我的上一篇文章已经介绍了如何通过COM Interop创建一个独立的AuoCAD二次开发应用程序。但是在开发过程感觉有些吃力,一方面是对这种开发方式运用还不熟练,另一方面是这种方法网上的资料真的很少。而基于.net api来开发AutoCAD的资料却很多,但是这种方式只能编译出一个dll文件,用起来不是很方便。于是我灵机一动,能否用COM Interop方式做主界面,然后在程序内部调用.net api方式生成的dll文件呢?嘿嘿,好一个围魏救赵,曲线救国…
一、开发工具
我使用的是 Visual Studio 2017 + AutoCAD 2019 + .NET Framework 4.7.2。版本不是重点,可根据自己实际来选择。
二、通过.net api创建类库项目
(一)新建项目
打开Visual Studio,新建一个类库(.Net Framework)项目。
(二)添加引用
- 选择创建的项目然后右键→添加→引用→浏览,在弹出的窗口中找到AutoCAD安装目录,依次添加
accoremgd、AcCui、acdbmgd、acmgd
这4个dll文件。注意:我用的是 AutoCAD 2019对应这4个类库文件,其它低版本可能只有其中3个,可自行去网上查询。
- 选中这4个引用,在属性栏中将复制本地属性改为false。
- 选择创建的项目然后右键→属性→调试,启动操作一栏选择启动外部程序,点击浏览并定位到AutoCAD安装目录,选择AutoCAD主程序“acad.exe”文件。
(三)代码编写
回到Class1.cs代码编辑界面,添加如下代码:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
namespace DrawCircle
{
public class Class1
{
[CommandMethod("Drawcircle")]//注册一个CAD命令
public void drawcircle()
{
Transaction trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();
BlockTable bt = (BlockTable)trans.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)trans