乐于分享
好东西不私藏

AutoCAD 2027 SDK:每个插件开发者都需要了解什么?

AutoCAD 2027 SDK:每个插件开发者都需要了解什么?

AutoCAD 2027 附带了新的 ObjectARX SDK。如果你维护 AutoCAD 的 C++ 或 .NET 插件,本文将介绍开发环境的变化、兼容性情况以及完整的 API 增量更新。


二进制兼容性与开发环境

并非每个AutoCAD版本都会破坏兼容性。当两个版本是二进制兼容时,为旧版本编译的插件会在新版本中干净地加载,无需重新编译。AutoCAD 2027 与 2026 或 2025 不兼容二进制版本——需要对新库进行全面重新编译。

发行
二进制兼容于
Windows — ObjectARX (C++)
Windows — Managed .NET
macOS
AutoCAD 2027
仅限2027年
VS 2026 v18.0,VC 工具 14.44.35207(推荐)
VS 2022 v17.14.9(仅限 C++)
VS 2026 v18.0 + .NET 10.0
macOS 15.4.1+,Xcode 16.3,Mono 6.1.2
AutoCAD 2026
2026, 2025
VS 2022 v17.10.4
VS 2022 v17.10.4 + .NET 8.0
macOS 14.3.1+,Xcode 15.4,Mono 6.1.2
AutoCAD 2025
仅限2025年
VS 2022 v17.8.0
VS 2022 v17.8.0 + .NET 8.0
macOS 13.3+,Xcode 14.3,Mono 6.1.2

注:Visual Studio 2022(v17.14)使用该工具集家族,但附带MSVC工具集版本14.44.35207,该版本足以为AutoCAD 2027编译ObjectARX C++项目。它不能用于针对 AutoCAD 2027 的托管 .NET 开发——Visual Studio 2026(v18.0,工具集)是必须的。

v143v145两个版本特定的标识符,用于在构建脚本中更新:

  • 链接器库后缀:— 例如 , ,26acdb26.libacge26.libacui26.lib
  • 注册表键:(曾经)。无论使用还是运行时,都不要硬编码这串字符串。

    R26.0 R25.1

    使用这样的代码来获取:acrxProductKey()AcDbHostApplicationServices::getUserProductRegistryRootKey()

搭建C++(ObjectARX)项目

ObjectARX 应用程序是通过扩展编译的标准 Windows DLL。以下项目设置取自典型的 SDK :.arx.vcxproj

背景设定
价值
配置类型
动态库(输出扩展).arx
平台工具集
v145— Visual Studio 2026(v18.0)使用v145工具集家族。
Visual Studio 2022(v17.14)使用该工具集家族,但包含MSVC工具集版本14.44.35207,足以为AutoCAD 2027编译ObjectARX项目。
v143
C++语言标准
stdcpp20(C++20)
符合模式
true
字符集
Unicode
附加目录
$(ObjectARX)\inc;$(ObjectARX)\inc-x64——两者皆为必选
附加lib目录
$(ObjectARX)\lib-x64
运行时库
多线程 DLL () — 在发布配置文件中明确设置/MD
检测64位可移植性问题
否
 — 通过 ObjectARX 头部抑制 C4311 警告
模块定义文件
$(ObjectARX)\inc\AcRxDefault.def—— 由SDK提供,定义了所需的内容,并无需声明即可导出acrxEntryPointacrxGetApiVersionLIBRARY
启用UAC
false
额外依赖
至少:rxapi.libacdb26.lib

注:包含各平台通用的头部; 包含64位专用的头文件。两个目录都必须在64位ARX构建的include路径上。incinc-x64

每个ARX应用必须导出两个入口点。最小源代码和DEF文件:

// main.cpp#include"rxregsvc.h"#include"acutads.h"extern "C" AcRx::AppRetCodeacrxEntryPoint(AcRx::AppMsgCode msg, void* appId){    switch (msg) {    case AcRx::kInitAppMsg:        acrxUnlockApplication(appId);   // allow unloading        acrxRegisterAppMDIAware(appId); // MDI-aware        acutPrintf("\nPlugin loaded.");        break;    case AcRx::kUnloadAppMsg:        acutPrintf("\nPlugin unloaded.");        break;    }    return AcRx::kRetOK;}

从SDK的目录中作为模块定义文件使用。它正确定义了所需的导出内容,且不包含语句,因此每个项目无需重命名。在链接器设置中设置:AcRxDefault.def\incLIBRARY

Linker → Input → Module Definition File
$(ObjectARX)\inc\AcRxDefault.def

用 、 命令或 APPLOAD 加载 build 文件。.arx(arxload "myapp")ARX


搭建托管型.NET项目

2027年最重要的变化是:托管应用必须以.NET 10.0为目标。AutoCAD 2025和2026使用.NET 8.0 LTS。

  1. 在VS 2026中创建一个面向.NET 10.0(长期支持)的类库项目。不要使用.NET Framework或Universal Windows版本。
  2. 编辑项目文件,设置为 ,然后添加:TargetFrameworknet10.0-windowsFrameworkReference
<ProjectSdk="Microsoft.NET.Sdk">  <PropertyGroup>    <TargetFramework>net10.0-windows</TargetFramework>    <ImplicitUsings>enable</ImplicitUsings>    <Nullable>enable</Nullable>  </PropertyGroup>  <ItemGroup>    <FrameworkReferenceInclude="Microsoft.WindowsDesktop.App" />  </ItemGroup></Project>

注:如果你的项目运行在.NET 6或更早版本,且从未迁移到.NET 8,这个元素是新的——明确添加它。FrameworkReference

  1. 添加对 、 和 的引用,以及你的 AutoCAD 安装中的引用。为每个 设置 Copy Local = False ——AutoCAD 在运行时提供这些信息。acdbmgd.dllaccoremgd.dllacmgd.dll
using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;[assembly: CommandClass(typeof(MyPlugin.MyCommands))]namespace MyPlugin{    public class MyCommands    {        [CommandMethod("HELLO")]        publicvoidHelloWorld()        {            var doc = Application.DocumentManager.MdiActiveDocument;            doc.Editor.WriteMessage("\nHello from .NET 10!");        }    }}

用命令在AutoCAD中加载装配,或者通过APPLOAD将其添加到启动套件中。NETLOAD


API 的新内容

2027 SDK 在数据库()、几何体()、运行时命名空间中新增成员、新的全局实用函数、新的MFC扩展类方法、新的常量,并移除了几个之前弃用的成员。托管的.NET库已经迁移到.NET 10,新增了一些成员并移除了一个。AcDbAcGeAcRx

完整的可搜索API差异在Autodesk帮助网站上:

  • Autodesk ObjectARX for AutoCAD 2027(C++)的新内容
  • AutoCAD 2027 托管型 .NET API 有什么新内容

有几点值得注意

需要彻底重建。更新工具链和库引用后,进行全面干净重建——针对旧对象文件的部分构建会在链接时失败。

在加载目录(LoadCatalogs)之前清除剪贴板。在 ACTC 剪贴板数据存在时加载工具面板目录可能会导致 AutoCAD 崩溃。先清理它:

IDataObject dataObj = System.Windows.Forms.Clipboard.GetDataObject();if (dataObj.GetFormats().Any(f => f.Contains("ACTC")))    System.Windows.Forms.Clipboard.Clear();ToolPaletteManager.Manager.LoadCatalogs();

仅支持单线程。ObjectARX 不支持多线程访问。如果你的应用程序生成线程,确保每次只有一个线程接触 ObjectARX 系统。

在中止前明确选择。

acedSSSetFirst(NULL, NULL);actrTransactionManager->abortTransaction();
.NET 在网络上的装配无法在未授予明确信任权限的情况下加载到 AutoCAD。本地部署。

相关学习资料