AutoCAD .NET插件自动化加载:LSP脚本驱动NETLOAD的工程实践

📅 2026/8/2 6:31:14 👁️ 阅读次数 📝 编程学习
AutoCAD .NET插件自动化加载:LSP脚本驱动NETLOAD的工程实践

1. 项目缘起:从手动加载到自动化加载的必然之路

如果你和我一样,长期在AutoCAD环境下进行二次开发,那么对NETLOAD这个命令一定不会陌生。每次启动CAD,或者打开一个新的图纸文件,第一件事往往就是打开命令行,输入NETLOAD,然后在弹出的文件对话框里找到那个熟悉的.dll文件,点击加载。日复一日,这个动作重复了成百上千次。对于个人开发者或者小团队来说,这或许还能忍受,但一旦开发的插件需要部署给几十甚至上百个用户时,问题就来了:如何确保每个用户都能正确、自动地加载我们的程序集,而不需要他们手动操作?用户可能忘记加载,可能加载了错误的版本,甚至可能因为操作不当导致CAD崩溃。这个看似简单的“加载”动作,就成了影响插件普及和用户体验的第一个门槛。

这正是我们今天要解决的核心问题:如何让基于.NET框架开发的DLL插件,在AutoCAD启动时实现“无感”自动加载。这里的“无感”,指的是用户无需任何干预,打开CAD就能直接使用插件功能。实现这一目标,LISP(LSP)脚本是我们的关键桥梁。LISP是AutoCAD内置的、历史悠久的脚本语言,其强大的自动化和定制能力,使其成为管理启动项和加载外部程序的绝佳工具。通过编写一个简单的LSP文件,我们就能指挥CAD在启动时乖乖地执行我们的命令,包括加载.NET DLL。

网络上关于NETLOAD和LSP自动加载的讨论很多,但信息往往零散,要么只讲LSP语法,要么只提一句“用(command “NETLOAD” …)”,对于实际工程中遇到的路径问题、加载失败处理、版本管理等细节避而不谈。本文将结合我多年的踩坑经验,不仅告诉你“怎么做”,更会深入剖析“为什么这么做”,以及“可能会遇到哪些坑,又该如何避开”。我们将从原理到实践,构建一个健壮、可靠的DLL自动加载方案。

2. 核心原理拆解:LSP如何驱动.NET程序集加载

在深入代码之前,我们必须理解AutoCAD中几种扩展机制的关系,这是避免后续混淆和错误的基础。很多人会把LSP、DLL、ARX、VLX等概念混为一谈,导致脚本写出来总是报错。

首先,明确对象类型。我们通过Visual Studio(C#或VB.NET)开发出来的Class Library项目,编译后生成的是.dll文件,这是一个标准的.NET程序集。AutoCAD本身(从2006版左右开始)构建在.NET框架之上,因此它可以托管并运行.NET代码。NETLOAD命令就是AutoCAD提供的,专门用于在运行时将外部的.NET程序集加载到当前应用程序域(AppDomain)中的机制。加载成功后,程序集中定义的命令(通过CommandMethod特性修饰的方法)就可以像内置命令一样被调用。

那么,LSP在这里扮演什么角色?LISP是一种解释型脚本语言,它运行在AutoCAD内部的LISP解释器中。它的优势在于轻量、灵活,能够方便地调用AutoCAD的几乎所有命令(包括NETLOAD)和访问图形数据库。但是,LSP不能直接调用我们.NET DLL中的方法(除非通过特定的互操作接口,那非常复杂)。它的核心作用是自动化流程。我们可以把LSP脚本看作一个“自动化操作员”,它的工作就是在合适的时机(如CAD启动时),向AutoCAD发送一系列预设好的命令。

因此,自动加载的流程链是这样的:

  1. AutoCAD启动。
  2. 自动执行预定义的LSP脚本(例如,通过添加到“支持文件搜索路径”并命名为acad.lspacaddoc.lsp)。
  3. LSP脚本中的代码被执行。
  4. LSP代码调用(command “NETLOAD” “完整路径\YourAddin.dll”)
  5. AutoCAD执行NETLOAD命令,将指定的.NET DLL加载进内存。
  6. 你的插件功能立即可用。

关键点在于:LSP是“发号施令者”,NETLOAD是“执行者”,而你的.NET DLL是“被加载的对象”。理解这一点,就能明白为什么LSP脚本里写的必须是AutoCAD能理解的命令,而不是C#代码。

3. 实战部署:构建一个健壮的自动加载LSP脚本

知道了原理,我们来动手编写这个核心的LSP脚本。一个最简单的版本可能只有一行:

(command “NETLOAD” “C:\\MyAddins\\MyPlugin.dll”)

但把这样的脚本投入生产环境,无疑是灾难性的。我们需要考虑各种边界情况,让它变得健壮。下面是一个我经过多年迭代,相对完善的自动加载脚本模板,我们将逐段解析。

;;; ------------------------------------------------------------ ;;; 自动加载管理器:LoadMyPlugin.lsp ;;; 功能:在AutoCAD启动时自动加载指定的.NET插件DLL ;;; 作者:[你的名字] ;;; 版本:1.2 ;;; ------------------------------------------------------------ (defun c:LoadMyPlugin ( / dllPath foundFlag) ;; 1. 定义DLL的绝对路径 - 这是最需要灵活处理的部分 ;; 方案A:硬编码绝对路径(不推荐用于分发) ;; (setq dllPath “C:\\Program Files\\MyCompany\\MyPlugin\\MyPlugin.dll”) ;; 方案B:基于LSP脚本自身位置定位DLL(推荐) ;; 假设DLL与LSP文件在同一目录,或在其子目录“bin”下 (setq dllPath (findfile “MyPlugin.dll”)) ; 首先在支持路径中搜索 (if (not dllPath) (progn ;; 如果没找到,尝试基于当前LSP文件路径构造 (setq lspPath (load “LoadMyPlugin.lsp” full)) ; 注意:这里需要根据实际获取LSP路径的方法调整,上述写法仅为示意 ;; 更通用的方法是使用一个预定义的相对路径或环境变量 ;; 此处为示例,我们使用一个预定义的公共位置 (setq dllPath “C:\\MyAddins\\MyPlugin.dll”) ) ) ;; 2. 检查DLL文件是否存在 (if (not (findfile dllPath)) (progn (alert (strcat “错误:无法找到插件文件!\n路径:” dllPath “\n\n请检查插件是否已正确安装。”)) (exit) ; 或 (princ “\n插件加载失败。”) ) ) ;; 3. 检查是否已经加载(避免重复加载导致冲突) ;; 这里需要根据你的插件特性来判断。一个简单方法是尝试调用插件的某个命令。 ;; 假设你的插件有一个名为“MYTEST”的命令。 (if (not (c:MYTEST)) ; 如果命令不存在,说明可能未加载 (progn ;; 4. 执行NETLOAD命令 (command “NETLOAD” dllPath) ;; 5. 验证加载是否成功 (if (c:MYTEST) ; 再次检查命令是否存在 (princ (strcat “\n插件 [MyPlugin] 加载成功。版本:” (get-plugin-version))) ; get-plugin-version需要你的DLL暴露相应方法 (alert “警告:NETLOAD命令执行完毕,但插件核心命令未注册成功,请检查DLL兼容性。”) ) ) (princ “\n插件 [MyPlugin] 已加载,无需重复操作。”) ) (princ) ; 静默退出 ) ;;; ------------------------------------------------------------ ;;; 自动执行部分 ;;; ------------------------------------------------------------ ;; 当该LSP文件被加载时,自动尝试加载插件。 ;; 将其放在acaddoc.lsp中或直接调用 (c:LoadMyPlugin) (if (not (member “LoadMyPlugin.lsp” (atoms-family 1))) ; 避免重复定义函数 (c:LoadMyPlugin) ) (princ “\nMyPlugin 自动加载器已就绪。”) (princ)

3.1 路径解析:自动加载的第一道坎

路径问题是自动加载失败的首要原因。脚本中的dllPath必须是AutoCAD进程能够访问到的绝对路径。上述脚本提供了两种思路:

方案A(硬编码):简单粗暴,但毫无灵活性。一旦用户安装路径不同,或者你更新了插件位置,脚本立即失效。仅适用于你自己电脑上的固定开发环境

方案B(动态定位):这是生产环境必须采用的策略。核心思想是让脚本自己找到DLL。有几种常见做法:

  1. 与环境变量配合:在安装程序中设置一个系统或用户环境变量,如MYPLUGIN_DIR。在LSP中,可以通过(getenv “MYPLUGIN_DIR”)获取路径,然后拼接出DLL的完整路径。这是最专业、最灵活的方式。
  2. 相对路径搜索:将LSP文件和DLL文件放置在固定的相对位置(例如,DLL在..\bin\目录下)。利用(findfile “相对路径/MyPlugin.dll”)函数在AutoCAD的所有支持文件搜索路径中查找。你需要确保插件安装程序将你的插件目录添加到了AutoCAD的“支持文件搜索路径”中。
  3. 查询注册表:对于通过安装程序部署的插件,通常会在注册表中写入安装路径。LISP可以通过(vl-registry-read …)函数读取注册表,但这需要vl-load-com已加载,且涉及更复杂的权限问题。

实操心得:对于需要分发给用户的插件,我强烈推荐“安装程序设置环境变量 + LSP读取环境变量”的方案。安装程序(如Inno Setup, WiX)可以可靠地设置环境变量并添加支持路径。在LSP脚本中,先尝试用(getenv)读取,如果失败,再给出明确的错误提示引导用户重新运行安装程序。

3.2 加载状态检测与容错处理

直接调用(command “NETLOAD” …)而不做任何检查是危险的。我们需要两层防护:

第一层:文件存在性检查。使用(findfile dllPath)检查文件是否存在。如果不存在,应立即用(alert)函数弹窗提示用户,并终止加载流程。友好的错误信息能极大减少用户的困惑和支持成本。

第二层:重复加载检测。重复加载同一个.NET程序集可能导致类型冲突、内存浪费,甚至引发不可预知的异常。检测方法取决于你的插件设计:

  • 命令检测法:如脚本所示,尝试调用一个你的插件注册的特定命令(如(c:MYTEST))。如果该命令不存在(返回nil),则认为插件未加载。这是最直接有效的方法。
  • 应用程序名检测法:如果你的插件在加载时向某个全局列表(如字典、变量)注册了自己,可以在LSP中检查这个标识是否存在。

踩坑记录:早期我曾忽略重复加载检测,用户有时会手动执行多次加载脚本,导致CAD内部对象实例化多次,最终在调用某些静态方法时抛出“对象已存在”的异常。加入检测后,用户体验稳定了很多。

第三层:加载后验证NETLOAD命令执行后,并不总是代表加载成功。有时DLL存在依赖项缺失(如某个VC++运行时库),会导致加载过程静默失败。因此,在(command “NETLOAD” …)之后,立即再次检测插件命令是否可用,可以第一时间发现加载失败,并给出提示。

4. 部署与集成:让LSP脚本在CAD启动时自动运行

写好LSP脚本只是第一步,如何让AutoCAD在每次启动时自动执行它,才是实现“自动加载”的关键。AutoCAD提供了多种机制来在启动时自动运行脚本,我们需要根据部署场景选择最合适的一种。

4.1 利用 acaddoc.lsp 或 acad.lsp

这是最经典、最常用的方法。AutoCAD在启动每个文档(Drawing)时,都会自动在其支持文件搜索路径中寻找并加载名为acaddoc.lsp的文件。同样,acad.lsp会在AutoCAD应用程序启动时加载一次。

操作方法

  1. 将你的加载脚本(例如LoadMyPlugin.lsp)放在一个固定的目录,比如C:\MyAddins\
  2. 创建或编辑acaddoc.lsp文件。如果不存在,就在文本编辑器中新建一个。
  3. acaddoc.lsp文件中,添加一行加载代码:
    (load “C:/MyAddins/LoadMyPlugin.lsp”)
    注意:LISP中路径斜杠正反皆可,但为避免转义问题,建议使用“/”或双反斜杠“\”。
  4. 将这个acaddoc.lsp文件放到AutoCAD支持文件搜索路径中的任何一个目录。为了确保它被找到,最好放到路径列表的靠前位置,或者直接放到AutoCAD的安装目录下(但不推荐,可能被覆盖)。

优缺点分析

  • 优点:简单,无需修改CAD配置,历史兼容性好。
  • 缺点
    • 管理混乱:如果多个插件都采用这种方式,acaddoc.lsp文件会被多次修改,容易冲突或被覆盖。
    • 加载时机acaddoc.lsp是在每个新文档打开时加载,这意味着如果你已经打开了一个CAD,再通过“新建”或“打开”另一个图纸,脚本会再次运行。这通常不是问题(因为有重复加载检测),但理论上增加了开销。
    • 依赖支持路径:如果移动了LSP文件的位置,必须同步更新acaddoc.lsp中的路径或确保支持路径包含新位置。

4.2 使用 AutoCAD 启动套件 (Startup Suite)

这是一个更图形化、更用户友好的管理方式。启动套件是AutoCAD的一个内置功能,允许用户通过对话框指定一系列在启动时自动加载的应用程序(包括LSP、DLL等)。

操作方法

  1. 在AutoCAD命令行输入APPLOAD,打开“加载/卸载应用程序”对话框。
  2. 点击右下角的“启动组”或“内容…”按钮(不同版本位置略有不同),打开“启动套件”对话框。
  3. 点击“添加”,找到你的LoadMyPlugin.lsp文件,添加进去。
  4. 关闭所有对话框,重启AutoCAD测试。

优缺点分析

  • 优点:图形化操作,对终端用户友好。信息保存在用户配置中,跟随用户走(如果配置了漫游)。
  • 缺点
    • 每台电脑需单独配置:无法通过安装程序一键部署,不适合大规模分发。
    • 可能被用户误删:用户可能在不知情的情况下从启动组移除你的插件。

4.3 通过注册表添加启动项 (推荐用于分发包)

这是最专业、最适合通过安装程序进行静默部署的方式。AutoCAD在启动时会读取Windows注册表中的特定位置,并执行那里列出的脚本。

注册表路径

  • 对于所有用户HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\Rxx.x\ACAD-xxxx:xxx\Applications\YourPluginName
  • 对于当前用户HKEY_CURRENT_USER\SOFTWARE\Autodesk\AutoCAD\Rxx.x\ACAD-xxxx:xxx\Applications\YourPluginName

其中Rxx.x是AutoCAD版本(如R24.3对应2025版),ACAD-xxxx:xxx是语言代码等标识。

需要创建的键值

  • LOADCTRLS(DWORD): 控制加载行为。常用值:12(表示在CAD启动和新建文档时加载,即acad.lspacaddoc.lsp的时机)。
  • LOADER(STRING): 你的LSP脚本的完整路径。
  • MANAGED(DWORD): 对于.NET程序,通常设为1。
  • DESCRIPTION(STRING): 插件的描述信息。

操作逻辑(通常在安装程序中完成)

  1. 安装程序将你的LoadMyPlugin.lsp.dll文件复制到目标目录(如%ProgramFiles%\YourCompany\YourPlugin\)。
  2. 安装程序在注册表的上述路径下创建你的插件项,并设置好LOADER等键值。
  3. 安装程序将插件目录添加到AutoCAD的“支持文件搜索路径”中(通过修改Profiles下的注册表项)。

优缺点分析

  • 优点:部署干净、专业,用户无感。一次配置,对所有用户生效(如果放在HKLM下)。是商业插件标准的做法。
  • 缺点:操作复杂,需要编写安装程序逻辑,并且要处理不同AutoCAD版本、位数(32/64位)的注册表路径差异。

部署策略建议:对于个人或小范围使用的工具,使用acaddoc.lsp或启动套件足矣。对于需要正式分发给客户的插件,务必使用安装程序+注册表部署的方式。这不仅能实现自动加载,还能一并处理支持路径、环境变量、文件关联等所有部署问题,提供真正的“一键安装”体验。

5. 进阶议题与疑难排错

即使按照上述步骤操作,在实际环境中你仍可能遇到各种问题。这一章我们集中讨论几个进阶话题和常见的“坑”。

5.1 处理DLL依赖项与加载失败

你的.NET DLL可能依赖其他第三方库(如Newtonsoft.Json.dll,SomeNative.dll等)。NETLOAD在加载主DLL时,如果找不到这些依赖项,会导致加载失败。

解决方案

  1. 探测路径(Probing):确保所有依赖的DLL与主DLL在同一目录下。这是.NET运行时默认的探测规则,也是最简单有效的方法。在安装时,将所有依赖项都复制到插件安装目录。
  2. 配置文件:可以为你的插件DLL创建一个.config配置文件(如MyPlugin.dll.config),在其中指定额外的程序集探测路径。但这在AutoCAD托管环境下有时不生效,可靠性不如方法1。
  3. AppDomain.AssemblyResolve 事件:在你的.NET插件代码中,可以在初始化时(例如在IExtensionApplication.Initialize()方法中)订阅AppDomain.CurrentDomain.AssemblyResolve事件。当运行时找不到某个程序集时,会触发这个事件,你可以在事件处理程序中手动从指定路径加载它。这是最强大但也是最复杂的方案。

典型的加载失败错误及排查

  • 错误:“无法加载文件或程序集 ‘XXX’ 或它的某一个依赖项。系统找不到指定的文件。”
    • 排查:检查XXX.dll是否存在于主DLL同级目录。使用Process Monitor工具过滤AutoCAD进程的文件访问操作,看它到底在哪些路径下寻找这个文件。
  • 错误:“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载。”
    • 排查:你的依赖项或主DLL可能是用.NET Framework早期版本编译的,而AutoCAD运行在更新的CLR版本下。在.config文件中添加<startup useLegacyV2RuntimeActivationPolicy=”true”>配置,或者尝试重新编译所有项目为统一的目标框架版本(如.NET Framework 4.8)。

5.2 64位与32位AutoCAD的兼容性处理

AutoCAD有32位和64位版本。你的.NET DLL必须与AutoCAD的位数匹配。为Any CPU编译的程序集通常可以在64位CAD上运行,但在32位CAD上,如果引用了特定平台的原生DLL(如某些仅提供x86版本的C++库),则可能失败。

最佳实践

  • 明确你的插件目标平台。如果全是托管代码,无原生依赖,编译为Any CPU
  • 如果依赖了原生DLL(例如通过P/Invoke调用),则必须分别为x86和x64平台编译,并准备两套安装包。在安装程序中检测系统AutoCAD的位数,安装对应的版本。
  • 在LSP脚本中,可以通过AutoCAD的系统变量PLATFORM(返回字符串如“Microsoft Windows NT 10.0 x64”)来大致判断位数,从而决定加载哪个路径下的DLL,但这增加了脚本复杂度。更常见的做法是在安装时就决定好,只安装对应版本的文件。

5.3 版本管理与静默升级

当插件需要更新时,如何确保用户自动加载新版本,而不会因为缓存等问题加载旧版本?

策略

  1. 强名称签名(Strong Name Signing):为你的程序集进行强名称签名。这样,不同版本的程序集在GAC或本地会被视为不同的程序集,可以并行存在。但AutoCAD插件一般不推荐安装到GAC。
  2. 文件版本覆盖:在安装新版本时,直接覆盖旧文件。这要求你的插件能处理好“热更新”问题,即旧版本DLL已加载在CAD进程中,此时覆盖文件,CAD并不会自动卸载旧版本加载新版本。用户需要重启CAD。
    • 可以在LSP脚本中加入简单的版本检查逻辑,如果检测到本地DLL文件版本比已加载的版本新,则提示用户重启CAD。
    (defun GetFileVersion (filePath) …) ; 需要编写一个函数来读取DLL文件版本 (if (> (GetFileVersion dllPath) (GetLoadedVersion)) ; GetLoadedVersion需要从已加载程序集获取 (alert “发现新版本插件,请重启AutoCAD以完成更新。”) )
  3. 独立的加载器:将自动加载逻辑写在一个极小的、稳定的“加载器DLL”中,并通过LSP加载这个“加载器”。“加载器”的责任是检查并加载真正的主插件DLL。这样,主插件可以任意更新替换,只要接口不变,“加载器”无需改动。这是一种更架构化的解决方案。

5.4 调试你的LSP自动加载脚本

当自动加载失败时,如何定位是LSP脚本问题,还是DLL本身问题?

调试步骤

  1. 手动执行:在CAD命令行中,直接输入(load “你的LSP文件完整路径”),观察命令行返回的信息。如果有语法错误,会直接显示。
  2. 分步测试:在LSP脚本中关键位置添加(princ “\nStep 1: …”)这样的打印语句,输出当前执行到的步骤和变量值。这是LISP最原始的调试方法,但非常有效。
  3. 检查命令行历史:AutoCAD的命令行窗口会记录所有命令和LISP的输出。仔细查看NETLOAD命令执行前后是否有错误信息。
  4. 查看Windows事件查看器:严重的.NET加载错误(如缺少运行时库)有时会记录在Windows的“应用程序”事件日志中,查看这里可能会有意外收获。
  5. 隔离测试:在LSP脚本中,暂时注释掉加载部分,只测试路径查找、文件存在性检查等逻辑是否正确。确认LSP逻辑无误后,再单独在命令行用NETLOAD命令手动加载DLL,测试DLL本身是否有问题。

6. 一个完整的工程化示例

为了将以上所有知识点串联起来,我设计一个简化但完整的工程化示例,展示一个名为“AreaCalculator”的插件的自动加载部署方案。

项目结构

AreaCalculatorAddin/ ├── AreaCalculator.sln (Visual Studio 解决方案) ├── AreaCalculator/ │ ├── Commands.cs (定义 AREACALC 命令) │ └── Properties/ │ └── AssemblyInfo.cs ├── Installer/ │ ├── setup.iss (Inno Setup 脚本) │ └── files/ │ ├── AreaCalculator.dll (编译好的主程序集) │ ├── AreaCalculator.dll.config (可选,配置文件) │ ├── Newtonsoft.Json.dll (依赖项) │ └── LoadAreaCalculator.lsp (自动加载脚本) └── README.md

1. .NET 插件代码 (Commands.cs):

using Autodesk.AutoCAD.ApplicationServices.Core; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; [assembly: CommandClass(typeof(AreaCalculator.Commands))] [assembly: ExtensionApplication(typeof(AreaCalculator.MyExtension))] namespace AreaCalculator { public class MyExtension : IExtensionApplication { public void Initialize() { // 插件初始化代码,如注册事件、初始化全局变量 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(“\nAreaCalculator 插件已初始化。”); } public void Terminate() { } } public class Commands { [CommandMethod(“AREACALC”, CommandFlags.Modal)] public void CalculateArea() { var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; ed.WriteMessage(“\n面积计算功能已调用。”); // 这里实现具体的面积计算逻辑... } } }

2. 自动加载LSP脚本 (LoadAreaCalculator.lsp):

;;; 环境变量 MYPLUGIN_DIR 由安装程序设置 (defun c:LoadAreaCalculator ( / pluginDir dllPath) (setq pluginDir (getenv “MYPLUGIN_DIR”)) (if (not pluginDir) (progn (alert “未找到环境变量 ‘MYPLUGIN_DIR’。请运行安装程序或联系管理员。”) (exit) ) ) (setq dllPath (strcat pluginDir “\\AreaCalculator.dll”)) (if (not (findfile dllPath)) (progn (alert (strcat “插件文件未找到:\n” dllPath)) (exit) ) ) ;; 通过尝试调用命令来判断是否已加载 (if (not (c:AREACALC)) (progn (command “NETLOAD” dllPath) (if (c:AREACALC) (princ “\nAreaCalculator 插件加载成功。”) (alert “警告:DLL加载后命令仍未注册,请检查依赖项或CAD版本。”) ) ) (princ “\nAreaCalculator 插件已加载。”) ) (princ) ) ;;; 自动执行 (if (not (member “LoadAreaCalculator.lsp” (atoms-family 1))) (c:LoadAreaCalculator) ) (princ “\nAreaCalculator 加载器已激活。”) (princ)

3. 安装程序脚本 (Inno Setup 示例片段):

[Setup] AppName=AreaCalculator for AutoCAD AppVersion=1.0 DefaultDirName={pf}\MyCompany\AreaCalculator [Files] Source: “files\AreaCalculator.dll”; DestDir: “{app}”; Flags: ignoreversion Source: “files\Newtonsoft.Json.dll”; DestDir: “{app}”; Flags: ignoreversion Source: “files\LoadAreaCalculator.lsp”; DestDir: “{app}”; Flags: ignoreversion [Registry] ; 为所有用户添加启动项 (64位 AutoCAD) Root: HKLM; Subkey: “SOFTWARE\Autodesk\AutoCAD\R24.3\ACAD-F001:804\Applications\AreaCalculator”; \ ValueType: string; ValueName: “DESCRIPTION”; ValueData: “Area Calculator Plugin”; \ Flags: createvalueifdoesntexist uninsdeletekey Root: HKLM; Subkey: “SOFTWARE\Autodesk\AutoCAD\R24.3\ACAD-F001:804\Applications\AreaCalculator”; \ ValueType: dword; ValueName: “LOADCTRLS”; ValueData: 12; \ Flags: createvalueifdoesntexist Root: HKLM; Subkey: “SOFTWARE\Autodesk\AutoCAD\R24.3\ACAD-F001:804\Applications\AreaCalculator”; \ ValueType: string; ValueName: “LOADER”; ValueData: “{app}\LoadAreaCalculator.lsp”; \ Flags: createvalueifdoesntexist Root: HKLM; Subkey: “SOFTWARE\Autodesk\AutoCAD\R24.3\ACAD-F001:804\Applications\AreaCalculator”; \ ValueType: dword; ValueName: “MANAGED”; ValueData: 1; \ Flags: createvalueifdoesntexist ; 设置环境变量 [Registry] Root: HKLM; Subkey: “SYSTEM\CurrentControlSet\Control\Session Manager\Environment”; \ ValueType: string; ValueName: “MYPLUGIN_DIR”; ValueData: “{app}”; \ Flags: createvalueifdoesntexist ; 添加支持文件搜索路径 (需要更复杂的脚本,此处仅为概念) ; 通常需要修改 AutoCAD 的注册表 Profiles 下的 SearchPath 键值,这需要额外的 Pascal 脚本代码。

这个示例展示了从代码开发、加载脚本编写到安装部署的完整闭环。关键在于安装程序要可靠地设置环境变量和注册表项,而LSP脚本则利用这些信息实现鲁棒的自动加载。