C# AutoCAD为插件创建桌面和开始菜单启动方式


先看效果

整体思路,

1.创建快捷方式

查看代码

public class AcadStartUpHelper
    {
        ///https://hfsoft.blog.csdn.net/article/details/90166607?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1.pc_relevant_default&utm_relevant_index=1
        /// 
        /// 启动程序后,请指定要运行的脚本(b 代表批处理)。如果脚本文件位于“起始”文件夹中,则该脚本文件的完整路径是必需的,除非提供 /six 命令行开关或将 LEGACYCODESEARCH 系统变量设置为 1 来禁止此安全措施。脚本可以用于设置新图形文件中的图形参数。假定 SCR 文件类型。
        /// 
        public const string 脚本名 = "/b ";
        /// 
        /// 启动时不显示徽标屏幕。
        /// 
        public const string 无产品徽标屏幕 = "/nologo ";
        /// 
        /// 定支持文件夹,而不是当前文件夹。图形支持文件包括字体、菜单、AutoLISP 文件、线型和填充图案。可以在路径中指定的文件夹的最大数目是 15。每一文件夹名用分号分隔。
        /// 
        public const string 支持文件夹 = "/s ";
        /// 
        /// 指定启动时应恢复已加载的 CUIx 文件中的哪个工作空间。
        /// 
        public const string 默认工作空间 = "/w ";
        /// 
        /// 基于样板或原型图形创建新图形。假定 DWT 文件类型。
        /// 
        public const string 样板文件名 = "/t ";
        /// 
        ///指定图形的指定视图,以便在启动时显示。
        /// 
        public const string 视图名 = "/v ";
        /// 
        /// 启动时禁用硬件加速。
        /// 
        public const string 禁用硬件加速 = "/nohardware ";
        /// 
        /// 在当前任务中禁止所有可执行文件的加载和执行。此开关可用于停止和定位恶意可执行代码。注意:但它也会阻止 Express Tools 和某些 AutoCAD 命令工具的运行,因此此开关应仅在紧急情况下使用。
        /// 
        public const string 禁用所有可执行代码 = "/safemode ";

        /// 
        /// 加载一个指定的 ARX 或 DBX 应用程序。请使用以下格式:<路径><文件名>.ARX,如果路径或文件名中包含空格,应使用双引号将路径或文件名引起来。如果未提供任何路径信息,将使用程序搜索路径。/b 开关中介绍的相同的安全措施将应用于 ARX 文件和 DBX 文件。
        /// 
        public const string ARX或DBX应用程序 = "/ld ";


        /// 
        /// 获取当前电脑上所有cad的exe文件的路径,LT不可用
        /// 
        /// 
        /// 
        public static List GetCurPcInstallAcadInfor()
        {
            var rtn = new List();
            if (AcadHelper.AcadMainKey != null)
            {
                foreach (var item in AcadHelper.AcadMainKey.GetSubKeyNames())
                {
                    var ver = AcadHelper.AcadMainKey.OpenSubKey(item);
                    if (ver != null)
                    {
                        var pro = new AcadProduct(item);
                        if (pro.ExeDir != "") rtn.Add(pro);
                        ver.Close();
                    }
                }
            }
            return rtn;
        }

        /// 
        /// 创建一个快捷方式
        /// 
        /// 快捷方式的完全限定路径
        /// acad.exe的路径
        /// 
        /// 描述
        /// 启动参数
        private static void CreateShortCut(string lnkFilePath, string targetFn, string workDir, string description, string args = "")
        {
            var shellType = Type.GetTypeFromProgID("WScript.Shell");
            dynamic shell = Activator.CreateInstance(shellType);
            dynamic shortcut = shell.CreateShortcut(lnkFilePath);
            shortcut.TargetPath = targetFn;
            shortcut.Arguments = args;
            shortcut.WorkingDirectory = workDir;
            shortcut.WindowStyle = 1;//设置运行方式,默认为常规窗口
            shortcut.Description = description;// '设置备注
            //shortcut.IconLocation = String.IsNullOrWhiteSpace(iconLocation) ? targetPath : iconLocation;//设置图标路径
            shortcut.Save();
        }


        /// 
        ///  创建c#,vbnet,f# 等插件的启动参数,LT不可用
        /// 
        /// 
        /// 
        public static string CreateCadNetLoadDllStarUpArgs(string dllfn, string scrDir = "")
        {
            var scrfn = scrDir == "" ? Path.ChangeExtension(dllfn, ".scr") :
                Path.Combine(scrDir, Path.GetFileNameWithoutExtension(dllfn) + ".scr");
            using (StreamWriter sw = new StreamWriter(scrfn))
            {
                sw.WriteLine("secureload 0");
                sw.WriteLine("cmdecho 0");
                sw.WriteLine("netload " + (char)34 + dllfn + (char)34);
                sw.Close();
            }
            string rtn = 无产品徽标屏幕 + 脚本名 + (char)34 + scrfn + (char)34;
            return rtn;
        }
        /// 
        /// 创建dvb,arx等插件的启动参数,LT不可用
        /// 
        /// DVB/Arx文件名称
        /// 
        public static string CreateCadApploadStarUpArgs(string Appfn, string scrDir = "")
        {
            var scrfn = scrDir == "" ? Path.ChangeExtension(Appfn, ".scr") :
                Path.Combine(scrDir, Path.GetFileNameWithoutExtension(Appfn) + ".scr");
            var ext = Path.GetExtension(Appfn);
            string rtn;
            if (string.Compare(ext, ".arx") == 0)
            {
                rtn = 无产品徽标屏幕 + ARX或DBX应用程序 + (char)34 + scrfn + (char)34;
            }
            else
            {
                using (var sw = new StreamWriter(scrfn))
                {
                    sw.WriteLine("filedia 0");
                    sw.WriteLine("secureload 0");
                    sw.WriteLine("cmdecho 0");
                    //(command "_VBALOAD" "myproj.dvb")
                    //(vl-vbaload  "E:/Programs/Cut-Fill.dvb")
                    sw.WriteLine("(vl-vbaload " + (char)34 + Appfn.Replace("\\", "/") + (char)34 + ")");
                    sw.WriteLine("filedia 1");
                    sw.Close();
                }
                rtn = 无产品徽标屏幕 + 脚本名 + (char)34 + scrfn + (char)34;
            }
            return rtn;
        }
        /// 
        /// 创建cad插件的临时快捷启动方式,LT不可用
        /// 
        /// 插件的文件名称
        /// cad的安装目录
        /// 插件描述
        /// 
        public static void CreateShortCutForApp(string fn, AcadProduct cadInfor, string desc, bool IsNetDll)
        {
            var tempDir = Environment.GetEnvironmentVariable("temp");
            var args = IsNetDll ? CreateCadNetLoadDllStarUpArgs(fn, tempDir) : CreateCadApploadStarUpArgs(fn, tempDir);
            var startMenuDir = $@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs";
            var lnkPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), Path.GetFileNameWithoutExtension(fn) + $"({cadInfor.AutoCADName}).lnk");
            var lnkPath1 = Path.Combine(startMenuDir, Path.GetFileNameWithoutExtension(fn) + $"({cadInfor.AutoCADName}).lnk");
            CreateShortCut(lnkPath, Path.Combine(cadInfor.ExeDir, "acad.exe"), Path.GetDirectoryName(fn), desc, args);
            CreateShortCut(lnkPath1, Path.Combine(cadInfor.ExeDir, "acad.exe"), Path.GetDirectoryName(fn), desc, args);
            //C:\ProgramData\Microsoft\Windows\Start Menu\Programs
        }

 
    }
查看代码

 public class AcadProduct
    {
        public string RelaseVer { get; set; }
        public string Version { get; set; }
        public string ExeDir { get; set; }
        public string LastLaunchedLanguage { get; set; }
        public string CurVer { get; set; }
        public string AutoCADName { get; set; }
        //public string ArxRegsiter { get; set; }
        public AcadProduct(string acadRelaseName)
        {
            var curProKey = AcadHelper.AcadMainKey.OpenSubKey(acadRelaseName);
            this.RelaseVer = acadRelaseName;
            var curVer = curProKey.GetValue("CurVer", "").ToString();
            var languageVer = curProKey.GetValue("LastLaunchedLanguage", "").ToString();
            var curVer1 = curVer.Substring(0, curVer.IndexOf(":"));
            var acadPath = curProKey.OpenSubKey(curVer1 + "\\Install").GetValue("INSTALLDIR").ToString();
            if (Directory.Exists(acadPath))
            {
                this.AutoCADName = new DirectoryInfo(acadPath).Name;
                this.CurVer = curVer1;
                this.Version = curVer;
                this.ExeDir = acadPath;
                this.LastLaunchedLanguage = languageVer;

            }
            curProKey.Close();
        }

        public override string ToString()
        {
            return $"{AutoCADName} {LastLaunchedLanguage}";
        }

        public List GetAddins()
        {
            List rtns = new List();

            var curProKey = AcadHelper.AcadMainKey.OpenSubKey(this.RelaseVer);
            var rgs = curProKey.OpenSubKey(this.Version + "\\Applications");
            if (rgs != null)
            {
                foreach (var item in rgs.GetSubKeyNames())
                {
                    var addin = new AcadArxAddin(item, this);
                    rtns.Add(addin);
                }
                rgs.Close();
            }
            curProKey.Close();
            return rtns;
        }

    }

    public enum AddinType
    {
        Arx = 0,
        VBA = 1,
        Net = 2
    }

 AcadHelper.AcadMainKey这个属性用下面的函数获取

var autodeskKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Autodesk");
                var acadKey = autodeskKey?.OpenSubKey("AutoCAD");
                return acadKey;