AutoCAD 2027 附带了新的 ObjectARX SDK。如果你维护 AutoCAD 的 C++ 或 .NET 插件,本文将介绍开发环境的变化、兼容性情况以及完整的 API 增量更新。
二进制兼容性与开发环境
并非每个AutoCAD版本都会破坏兼容性。当两个版本是二进制兼容时,为旧版本编译的插件会在新版本中干净地加载,无需重新编译。AutoCAD 2027 与 2026 或 2025 不兼容二进制版本——需要对新库进行全面重新编译。
| AutoCAD 2027 | VS 2022 v17.14.9(仅限 C++) | |||
| AutoCAD 2026 | ||||
| AutoCAD 2025 |
注: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 | |
stdcpp20(C++20) | |
true | |
$(ObjectARX)\inc;$(ObjectARX)\inc-x64——两者皆为必选 | |
$(ObjectARX)\lib-x64 | |
多线程 DLL () — 在发布配置文件中明确设置/MD | |
| 否 | |
$(ObjectARX)\inc\AcRxDefault.def—— 由SDK提供,定义了所需的内容,并无需声明即可导出acrxEntryPointacrxGetApiVersionLIBRARY | |
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 unloadingacrxRegisterAppMDIAware(appId); // MDI-awareacutPrintf("\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。
在VS 2026中创建一个面向.NET 10.0(长期支持)的类库项目。不要使用.NET Framework或Universal Windows版本。 - 编辑项目文件,设置为 ,然后添加:
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
- 添加对 、 和 的引用,以及你的 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();
夜雨聆风