Revit Dynamo自定义节点是编译为DLL的.NET类库,依赖DynamoCore等NuGet包且须目标net8.0;Revit插件则需引用RevitAPI.dll、配置.addin文件并锁定net48,二者开发逻辑、依赖与部署方式完全不同。

Revit Dynamo自定义节点 ≠ Revit插件,别混用项目模板
VSCode里做Dynamo自定义节点开发,和写Revit外挂插件是两套逻辑。前者本质是编译成DLL供Dynamo加载的.NET类库,不依赖RevitAPI.dll,也不需要注册到Revit Add-In目录;后者必须引用RevitAPI.dll、目标框架锁定net48、且需配置.addin文件。用VS创建的Revit插件项目直接丢进VSCode,十有八九编译失败——因为Dynamo节点只认CoreNodeModels.dll和DynamoServices.dll这些Dynamo自己的运行时依赖。
必须安装.NET SDK 8.0,不是.NET Framework 4.8
Dynamo 2.13+(对应Revit 2023/2024)已全面转向.NET 8.0运行时,官方明确要求自定义节点项目使用net8.0目标框架。装错SDK会导致以下现象:
-
dotnet build报错:CS0234 “The type or namespace name 'Dynamo' does not exist” - VSCode中
using Dynamo.Core;标红,OmniSharp无法解析类型 - 即使手动添加DLL引用,
Assembly.LoadFrom在Dynamo里加载时抛BadImageFormatException
验证方式:dotnet --list-sdks输出中必须含8.0.x(如8.0.300),不能只有4.8.1或6.0.x。Windows用户建议用winget install Microsoft.DotNet.SDK.8安装,避免路径权限问题。
引用Dynamo核心DLL不能靠“浏览”,得用PackageReference
把DynamoCore.dll、DynamoServices.dll从Dynamo安装目录拖进VSCode项目,看似能编译通过,但运行时99%会崩溃。根本原因是这些DLL内部强依赖特定版本的Newtonsoft.Json、ICSharpCode.AvalonEdit等,手动引用会破坏依赖链。
正确做法是用NuGet包管理:
- 在
.csproj中添加PackageReference而非Reference - 必需的包:
DynamoCore(对应Dynamo主版本)、DynamoServices、DynamoUnits - 示例片段:
<ItemGroup> <PackageReference Include="DynamoCore" Version="2.13.0" /> <PackageReference Include="DynamoServices" Version="2.13.0" /> </ItemGroup>
版本号必须与你本地Dynamo版本严格一致(查法:%APPDATA%\Dynamo\Dynamo Core\2\packages 或启动Dynamo后看右下角版本号)。错一个点,比如2.13.0写成2.13,就会加载失败。
调试节点时,VSCode的launch.json要指向Dynamo.exe
按F5直接调试会失败——因为Dynamo节点不是独立进程,它必须被Dynamo宿主加载。你需要让VSCode启动的是Dynamo本身,并附加到其进程:
- 在
.vscode/launch.json中配置type: "coreclr",request: "attach" -
processId留空,改用processName: "Dynamo"(实际进程名是DynamoSandbox.exe或DynamoRevit.exe,取决于你用Dynamo for Revit还是独立版) - 确保Dynamo已启动并打开一个空白文件,再按F5——VSCode会自动匹配进程并注入调试器
- 断点打在
Execute方法内才有效;构造函数或静态初始化器里设断点基本无效
最容易被忽略的一点:Dynamo默认禁用调试模式。必须在Dynamo设置里勾选Enable Debug Mode(菜单→Settings→Advanced→Debug Mode),否则即使附加成功,断点也不会命中。


















