AutoCAD开发如何使得同一个dll适配多种不同版本的CAD, 并在CAD打开的时候自动启动插件

第一步,要实现同一个dll兼容用户电脑上多个版本的AutoCAD, 首先需要获取用户电脑上所有已经安装的CAD版本

这里要先定义一个字符串列表,用来存放所有的CAD版本

public List<String> m_allVersion;

通过注册表获取用户电脑上所有已安装的CAD版本,

相关方法如下:

 /// <summary>
        /// 获取用户电脑上所有已安装的AutoCAD版本
        /// </summary>
        private void getAllCADVersion()
        {
            //this.tb_path.Text = m_setUpPath; //设置
            m_allVersion = new List<string>();

            try
            {
                //获取所有AutoCAD版本并填充到版本选择框中
                String[] tmp = SetupProcess.GetAutoKeyName().Split('\n');
                foreach (String str in tmp)
                {
                    if (str == "") continue;   //如果是空字符串就跳过
                    m_allVersion.Add(str);
                }
            }
            catch
            {
                string errorString = "获取注册表CAD版本号失败!";
                MessageBox.Show(errorString, "ERROR");
                logger.LogError(errorString);
            }
            //if (cb_version.Items.Count > 0) cb_version.SelectedIndex = cb_version.Items.Count - 1;

        }
/// <summary>
        /// 获取CAD所属注册表键名(HKEY_CURRENT_USER\SOFTWARE\Autodesk\AutoCAD\R20.1\ACAD-F001:804)
        /// </summary>
        /// <returns>返回所有版本的注册表键名(SOFTWARE\Autodesk\AutoCAD\R20.1\ACAD-F001:804)</returns>
        public static String GetAutoKeyName()
        {
            String ret = "";
            RegistryKey keyRoot = Registry.CurrentUser;
            RegistryKey keyCAD = keyRoot.OpenSubKey("Software\\Autodesk\\AutoCAD");      //CAD表键目录
            String[] CADPreVersions = keyCAD.GetSubKeyNames();                            //CAD各版本代号如(CAD2016 R20.1)
            if (CADPreVersions.Length < 1) return ret;                                   //没有安装CAD
            for (int i = 0; i < CADPreVersions.Length; i++)
            {
                keyCAD = keyRoot.OpenSubKey("Software\\Autodesk\\AutoCAD" + "\\" + CADPreVersions[i]);
                if (keyCAD.GetValue("CurVer") != null)
                {
                    String str = (keyCAD.GetValue("CurVer").ToString());
                    RegistryKey KeyVersion = keyCAD.OpenSubKey(str);
                    ret += KeyVersion.Name.Substring(keyRoot.Name.Length + 1) + "\n";
                }
            }
            return ret;
        }

第二步,定义本插件支持的CAD版本,进行比对

        以下定义一些相关属性:

        /// <summary>
        /// 本插件支持的CAD版本
        /// </summary>
        public String[] m_CADsupport = { "2007.dll", "2010.dll", "2012.dll", "2013.dll", "2014.dll", "2016.dll", "2018.dll", "2019.dll", "2020.dll", "2022.dll", "2023.dll" };

        /// <summary>
        /// CAD二次开发_加载外部参照dll的名字
        /// </summary>
        public static string CAD = "XattachGEDI";

        /// <summary>
        /// 动态库名
        /// </summary>
        public String m_dllName;

        /// 默认安装路径
        /// </summary>
        public String m_setUpPath = @"D:\GEDI\DocWatch";

下面为安装函数:

        /// <summary>
        /// 在默认位置安装所有版本的插件
        /// </summary>
        public void installer()
        {
            //获取本电脑上所有安装的CAD版本
            getAllCADVersion();

            //安装程序集类型
            m_dllName = CAD;

            //获取CAD安装版本库
            bool hasCopiedFiles = false;   //创建一个标识, 表明是否复制了文件, 默认值为假

            List<string> m_allVersion_Name = new List<string>();   //用户电脑上安装的所有CAD版本的列表
            List<string> version_installSuccessfully = new List<string>();  //插件安装成功的CAD版本
            List<string> version_installFailed = new List<string>();        //插件安装失败的CAD版本

            if (m_allVersion == null || m_allVersion.Count == 0)
            {
                string err = "该电脑未安装AutoCAD,请先安装!";
                MessageBox.Show(err, "提示");
                logger.LogError(err);
                return;
            }

            //遍历安装所有用户电脑上的各种CAD版本
            foreach (string regVerson in m_allVersion)
            {
                //MessageBox.Show("注册表项字符串:" + regVerson, "注册表项字符串");
                string versionName = GetVersion(regVerson);  //通过注册表项获取版本名
                if (versionName == "")
                {
                    string errorStr = "通过注册表项获取AutoCAD版本名失败, 本插件暂不支持此版本! 请联系开发人员进行版本兼容。 \n注册表项字符串为:" + regVerson;
                    MessageBox.Show(errorStr, "提示");
                    logger.LogError(errorStr);
                    continue;  //跳过以下代码
                }

                m_allVersion_Name.Add(versionName);

                //MessageBox.Show("版本名称:" + versionName, "版本名称");
                string versionYear = versionName.Split(' ')[1].Substring(0, 4);  //通过版本名称获取年号

                string versionDll = m_dllName + versionYear + ".dll";   //通过年号获取到 dll全名
                //MessageBox.Show("dll全名:" + versionDll, "dll全名");

                bool isSupportedVersion = false;

                //将通过注册表获取到的dll文件与本插件支持的版本进行匹配, 检查生成的dll文件是否在支持的版本列表 m_CADsupport中
                foreach (String str in m_CADsupport)
                {
                    //如果文件名字与支持的版本匹配成功
                    if (m_dllName + str == versionDll)
                    {
                        isSupportedVersion = true;
                        break;
                    }
                }

                if (!isSupportedVersion)
                {
                    string err = "插件暂不支持此版本" + versionName + "\n请复制当前CAD版本安装目录中的文件\n【AcCui.dll】【acdbmgd.dll】【acmgd.dll】【accoremgd.dll(若没有可忽略)】\n提交给开发人员进行兼容!";
                    //MessageBox.Show(err, "提示");
                    logger.LogError(err);

                    continue; //跳过不支持的版本,下面的文件复制和加入注册表的代码不执行
                }

                //如果没有复制过,则复制bin文件夹下的所有文件
                if (!hasCopiedFiles)
                {
                    //复制dll资源到指定安装目录
                    if (!System.IO.Directory.Exists("bin"))
                    {
                        string err = "当前安装目录下的安
<think>好的,我现在需要处理用户关于CAD插件开发的查询。用户提到想了解教程、工具和最佳实践。首先,我得回忆一下之前提供的引用内容,看看有哪些相关信息可以利用。 引用[1]提到C#.NET开发AutoCAD插件的实例源码,项目地址和示例代码,这可能对用户有帮助。引用[2]是关于VBA进行AutoCAD二次开发的指南,包含语法和案例。引用[3]介绍了Vectorworks的配置和开发环境,虽然用户可能主要关注AutoCAD,但Vectorworks的信息可以作为补充。引用[4]的项目地址可能与字体相关,可能不太相关,但暂时记下来。 用户需要教程、工具和最佳实践,所以应该分这三个部分回答。首先教程方面,可以推荐引用[1]和[2]中的资源,分别对应C#和VBA。工具方面需要提到开发环境,比如Visual Studio、AutoCAD SDK、以及引用[3]中的Vectorworks SDK,但主要聚焦AutoCAD。最佳实践包括代码结构、调试、文档等,可以结合引用中的内容。 还要注意用户可能对不同的编程语言感兴趣,比如C#和VBA,所以需要分别说明。同时,项目地址可能需要检查是否有效,但根据引用内容直接提供即可。另外,用户可能没有明确使用哪个CAD软件,但根据引用,主要是AutoCAD和Vectorworks,所以应该涵盖这两者,但以AutoCAD为主。 需要确保回答结构清晰,分点列出,使用用户提供的引用作为支持。可能还要生成相关问题,比如询问语言选择、调试方法或跨平台开发等。最后,检查是否有遗漏的信息,比如其他工具或资源,但根据现有引用,应该足够覆盖。</think>### CAD插件开发教程、工具与最佳实践 --- #### **一、开发教程** 1. **C#.NET开发AutoCAD插件** - **核心内容**:通过C#.NET语言调用AutoCAD.NET API实现插件功能,例如自动化绘图、自定义命令等。 - **资源推荐**: - [C#.NET开发AutoCAD插件实例源码](https://gitcode.com/open-source-toolkit/8d71c):提供完整的代码示例和项目结构,适合快速入门[^1]。 - **关键步骤**: - 引用`AcCoreMgd`和`AcDbMgd`等AutoCAD库。 - 使用`CommandMethod`属性定义自定义命令。 ```csharp using Autodesk.AutoCAD.Runtime; public class MyCommands { [CommandMethod("MyCommand")] public void MyCommand() { // 执行绘图或编辑操作 } } ``` 2. **VBA开发AutoCAD插件** - **适用场景**:快速实现简单功能(如批量修改图层、生成报表)。 - **资源推荐**: - [Autodesk官方VBA开发指南](https://www.autodesk.com/developer-network/platform-technologies/vba):涵盖对象模型、语法及案例[^2]。 - **示例代码**: ```vba Sub CreateCircle() Dim center(0 To 2) As Double center(0) = 0: center(1) = 0: center(2) = 0 ThisDrawing.ModelSpace.AddCircle center, 5 End Sub ``` --- #### **二、开发工具** 1. **编程环境** - **C#开发**:Visual Studio(需安装AutoCAD .NET SDK)。 - **VBA开发**:AutoCAD内置VBA编辑器(需在选项中启用)。 2. **SDK与工具包** - **AutoCAD .NET SDK**:提供API文档和示例代码,支持高级功能(如自定义实体、事件处理)。 - **Vectorworks SDK**:适用于跨平台设计插件开发[^3]。 3. **调试工具** - **AutoCAD NET Loader**:加载调试DLL文件。 - **日志输出**:使用`Editor.WriteMessage()`实时输出调试信息。 --- #### **三、最佳实践** 1. **代码规范** - **模块化设计**:将功能拆分为独立类库,例如绘图模块、数据交互模块。 - **异常处理**:捕获`COMException`和`Autodesk.AutoCAD.Runtime.Exception`。 2. **性能优化** - **事务管理**:使用`Transaction`对象批量操作数据库,减少IO开销。 - **内存管理**:及时释放非托管资源(如`DBObject`)。 3. **用户交互** - **自定义界面**:通过WPF或Windows Forms创建交互式面板。 - **兼容性**:适配多个AutoCAD版本(如2020-2024)。 --- #### **四、相关工具推荐** 1. **开源项目参考** - [FontCenter](https://gitcode.com/gh_mirrors/fo/FontCenter):字体管理插件,展示复杂功能实现[^4]。 2. **文档与社区** - Autodesk开发者中心:提供API更新和技术支持。 - Stack Overflow:搜索`autocad-plugin`标签解决常见问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值