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 = "当前安装目录下的安
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值