简介:RevitLookup 2020是一套面向Revit二次开发人员的插件工具包,能以树形结构展示当前选中元素的类别、参数、几何与内部引用数据,让开发者无需频繁编写调试代码即可直观理解Revit对象关系,适合项目调试和对象模型学习。压缩包共161个文件,体积约1.05MB,主体为78个C#源文件,同时提供RevitLookup.addin加载配置、编译好的DLL与PDB调试文件,以及Visual Studio解决方案/工程文件;另含位图、图标、XML样式表和HTML帮助文档,涵盖源码、配置、编译产物与文档多个层面。已有1654人学习下载。相比仅提供编译版,本包额外给出完整源码,既可在版本匹配时直接加载使用,也能在Revit升级或引用路径变化后自行调整源码并重新编译,借助PDB可进行断点调试,适合Revit插件开发者、BIM二次开发入门者及需要排查插件加载问题的技术人员。
1. RevitLookup 2020:装之前先把版本这一关想清楚
做Revit二次开发的人,几乎都绕不开一个问题:拿到一个Element,怎么知道它有哪些参数、哪些几何数据、内部结构长什么样。翻API文档翻到眼睛花,不如直接在界面上点开看。RevitLookup就是干这个的——它把Revit数据库里的对象结构完整暴露出来,从Element到Parameter,从Geometry到Internal,一路点下去就能看到对象在API层面到底是什么。这工具在Revit开发者圈子里流传多年,但每次换Revit版本,都会有人因为装错版本翻车——装了2021的插件硬塞给2020,结果Revit启动时加载失败,或者外部工具里根本没有入口。这篇笔记把RevitLookup 2020(含源码和addin)从环境核对、文件安装、清单配置到验证跑通的完整过程记录下来,给正在配环境的人一个能照着走的方案。适合Revit二次开发初学者、BIM工具链维护者,以及被插件加载问题卡住的人。
2. 安装前核对:Revit 2020版本匹配与运行环境
2.1 为什么版本号必须对齐
RevitLookup不是独立运行的exe程序,而是以Revit外部应用(External Application)的身份被加载进Revit进程里的。Revit启动时,会读取AddIns目录下的addin清单文件,按照清单里写的程序集信息去加载dll,然后在“附加模块”选项卡里注册功能区面板。
这一套机制的直接约束是:dll在编译时引用的RevitAPI程序集版本,必须和当前运行中的Revit主版本一致。Revit 2020的API程序集是RevitAPI.dll和RevitAPIUI.dll,程序集文件版本是20.0.x。如果你拿的是Revit 2021的RevitLookup,它引用的API程序集版本是21.0.x,加载时CLR一解析引用就会对不上,最常见的两种结果是:Revit启动时弹出“无法加载外部工具”对话框,或者没有任何提示但插件命令消失。
更隐蔽的问题是API签名差异。Revit 2020到2021之间,部分API方法签名有调整,RevitLookup这种深度反射调用API的工具对签名变化异常敏感。就算把addin文件里的版本号手工改掉,强行让2021插件被2020加载,运行到某些功能时同样会抛MethodNotFoundException。所以第一原则就一句话:RevitLookup 2020只能用Revit 2020,不能降级也不能跨版。
反过来还有一坑:Revit 2020和2021主程序可能安装在同一台机器上,AddIns目录是按年份分开的。这时候装插件一定要把addin文件放进2020对应的子目录,别放到旁边的2021目录里,肉眼看起来差不多,实际加载路径完全不一样。
主版本号确认方法:启动Revit,文件菜单→关于Revit,对话框里能看到“版本: 2020”,“内部版本号: 20.x.x.x”。如果你的Revit是2019或2021,请直接去找对应版本的RevitLookup,不要在2020的安装步骤上硬套。
注意:插件版本年份必须与Revit主版本保持一致,改addin文件的版本描述救不了跨版问题。
2.2 系统运行环境要求
Revit 2020对操作系统要求是Windows 10 64位或Windows 7 SP1 64位(现在还在用Win7的机子基本都要淘汰了,但历史项目里确实还有幸存者)。RevitLookup是托管程序集,依赖.NET Framework 4.7及以上版本。Revit 2020的安装程序会自动检测并安装这个组件,但如果你是在精简版系统或者绿色版Revit环境里折腾,这一步非常容易被跳过。
安装前建议确认三件事:
- Revit 2020能正常启动并创建项目文件,说明主程序没问题;
- 系统里.NET Framework 4.7+已安装,用命令快速检测;
- 从关于对话框里确认主版本号是2020,不是2019也不是2021。
检测.NET Framework版本的PowerShell命令:
# 读取注册表.NET Framework v4 Full节点,Release就是版本号 Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" -Name Release | Select-Object ReleaseRelease值大于461808说明4.7.1已就绪,大于528040说明4.8已就绪,这两个版本都能满足RevitLookup 2020的运行需求。输出Release为0或者路径不存在,说明.NET组件缺失,装一个.NET Framework 4.8运行库再继续。
还需要检查VC++运行库。Revit 2020安装时会把它需要的Visual C++运行库装好,但某些精简版Revit或绿色版会漏掉这个环节。插件加载时如果报“无法定位程序输入点”之类的错误,十有八九就是运行库问题。打开控制面板的程序列表,确认Microsoft Visual C++ 2015-2019 Redistributable (x64)在列。缺的话装一个x64版本,顺手把x86也装了,防止其他插件也用。
如果检测结果不满足,后面的所有步骤都不用做,因为即使插件文件放对了位置,Revit加载dll时也会因为依赖程序集缺失而静默失败,这是最先要排除的黑匣子。很多人问“插件装了没反应”,一问.NET版本还是4.5,问题根本不在插件配置上。
2.3 包内文件组成与各自作用
RevitLookup 2020的发布包(含源码和addin)在解压之后,核心是四类东西:
| 文件/目录 | 作用 | 安装时需要 |
|---|---|---|
| LookupAddIn.addin | Revit的AddIn清单文件,XML格式,告诉Revit加载哪个dll、类名是什么 | 必须 |
| RevitLookup.dll | 编译好的插件主程序集,所有Snoop逻辑都在里面 | 必须 |
| 源码目录(.sln + 多个.csproj) | Visual Studio解决方案,含插件全部源代码 | 可选 |
| 说明/许可文件 | 版本说明和使用许可 | 可选 |
先说addin文件,它是整个安装的入口。Revit启动时会扫描指定目录下所有.addin后缀的文件,解析XML,按 节点指定的内容去加载插件程序集。addin文件丢了或者XML坏掉,dll就算躺在目录里也不会被加载。这个文件是整个链条里排第一位的故障点,第3章会逐行拆解。
再说dll文件,RevitLookup的dll内部依赖RevitAPI.dll和RevitAPIUI.dll,这两个文件由Revit主程序自带,不需要复制到插件目录。这一点和普通.NET程序有区别——普通程序要把依赖dll都拷到同一目录,而Revit插件只需要把插件自己的dll放进AddIns目录,API引用在加载时由Revit进程自动解析。第一次装的人最容易在这一步多此一举,把Revit安装目录里的RevitAPI.dll复制到AddIns目录里,搞出重复程序集加载的问题,症状比不装还奇怪。
源码目录存在的意义在于RevitLookup本身是开源的,如果你有二次开发需求,比如想把Snoop结果导出成结构化JSON数据,可以直接改源码重新编译。但注意,源码是针对特定Revit版本维护的,2020源码编译出来的dll目标框架是.NET Framework 4.7,引用的是Revit 2020的API程序集,这些信息在.csproj项目文件里都有标注。第4章会单独讲源码编译的常见报错。
解压发布包之前,顺手看一眼压缩包命名。RevitLookup的发布包通常会在文件名里带版本年份,比如RevitLookup_2020_xxx.zip。解压后如果发现addin文件里的程序集名称和手里dll对不上,先别急着改XML,回到发布说明看看是不是前置依赖包没一起解压。发布包解压之后目录不要移动,安装时要按实际路径去放文件。
3. 安装与配置:addin文件放置与清单解析
3.1 AddIns目录怎么选
Revit 2020扫描AddIn清单文件时会同时扫两个路径,这两个路径的覆盖范围不同:
- 用户级别:
%AppData%\Autodesk\Revit\Addins\2020\ - 系统级别:
C:\ProgramData\Autodesk\Revit\Addins\2020\
用户级别目录只对当前Windows账号生效。如果这台机器还登录着其他Windows账号,别的账号打开Revit时会看不到这个插件。系统级别目录对这台机器上的所有账号生效,适合BIM团队共用的工作站。
个人开发机或者单机测试环境,建议放用户级别。原因有几点:第一,不需要管理员权限,改起来方便;第二,出问题时删除干净,不会残留到其他账号;第三,Visual Studio调试Revit插件时,工程属性的调试命令行里一般也指定用户级别AddIn路径,两边一致调试最省心。
如果Windows账号是标准用户,系统级别目录写入会触发UAC弹窗,得输入管理员密码。这种情况没得选,只能放用户级别。反过来,如果机器是团队共用的,想给所有账号都装上插件,那就得放系统级别,并且确保每个账号打开Revit前都有读取该目录的权限。
3.2 放置文件的具体操作
假设已经把RevitLookup 2020发布包解压到D:\Downloads\RevitLookup2020,目录下能看到addin文件和dll文件。操作按三步走。
第一步,打开当前用户的AddIns目录:
# 打开Revit 2020对应的用户AddIns目录 explorer "$env:APPDATA\Autodesk\Revit\Addins\2020"目录不存在时explorer会直接报错,不用慌,先创建:
# 强制创建多级目录,顺便把父目录一起建好 mkdir "$env:APPDATA\Autodesk\Revit\Addins\2020" -Force第二步,复制addin和dll文件:
# 复制addin清单文件到Revit加载目录 Copy-Item "D:\Downloads\RevitLookup2020\LookupAddIn.addin" "$env:APPDATA\Autodesk\Revit\Addins\2020\" -Force # 复制插件主程序集 Copy-Item "D:\Downloads\RevitLookup2020\RevitLookup.dll" "$env:APPDATA\Autodesk\Revit\Addins\2020\" -Force两条命令里的路径都要带引号,Windows路径含空格时没引号会传参错误。Force参数的含义是目标目录已有同名文件时直接覆盖,避免交互询问。覆盖前想清楚,旧版本dll会被替换掉,回不去了。
第三步,确认文件落位:
# 列出AddIns目录内容,确认两个文件都在 dir "$env:APPDATA\Autodesk\Revit\Addins\2020\"这一步不能省。最常见的翻车是文件复制到了2021或2019目录,Revit 2020里自然什么都找不到。列目录看到刚才的两个文件后,再进行下一步。
如果包里还有说明文件,顺手在AddIns目录里放一个说明文件副本,备注当前插件的版本来源和安装日期。环境换多了就知道这个小习惯多有用——半年后回来看目录,不至于对着dll文件一脸茫然。
提示:复制完dll和addin文件之后,先dir确认文件都在,再启动Revit。
3.3 AddIn清单文件逐段拆解
addin文件的本质是XML,Revit通过它知道三件事:加载哪个dll、加载哪个类、以什么身份加载。RevitLookup 2020的addin文件结构一般是这样:
<?xml version="1.0" encoding="utf-8"?> <RevitAddIns> <!-- addin文件:Revit启动时读取并加载插件 --> <AddIn Type="Application"> <Name>RevitLookup</Name> <!-- Assembly只写dll文件名,Revit默认在同目录寻找 --> <Assembly>RevitLookup.dll</Assembly> <AddInId>00000000-0000-0000-0000-000000000001</AddInId> <FullClassName>RevitLookup.App</FullClassName> <VendorId>ADV</VendorId> <VendorDescription>RevitLookup 2020 - Database Snoop Tool</VendorDescription> </AddIn> </RevitAddIns>哪个标签最容易写错?AddInId和FullClassName。
AddInId是插件的唯一标识GUID。同一台机器上,两个插件声明相同AddInId时,Revit会拒绝加载后加载的那个。最常见的情况是网上复制addin模板时连别人的GUID一起复制了,结果和某插件撞ID,表现就是插件时好时坏,取决于安装顺序。真改的话用PowerShell生成新GUID替换:
# 生成一个新的GUID,用来替换addin文件里的AddInId节点 [guid]::NewGuid().ToString()FullClassName必须和dll里的实际类名完全一致,包括命名空间前缀。RevitLookup的类名通常形如RevitLookup.App,但如果你用源码自行编译并改过命名空间,这里要跟着改。怎么确认dll里实际类名?用ILSpy或dnSpy打开RevitLookup.dll,展开命名空间,找到实现IExternalApplication接口的类,FullClassName就写它的全名。
还有两个细节。第一,Assembly节点默认只写文件名不写路径,Revit会在addin文件所在目录找这个dll。所以3.2里把addin和dll放同一目录,就是这个原因。如果非要把dll放其他位置,Assembly里写绝对路径也行,但绝对路径一旦变动插件就废了,不建议。第二,XML文件编码建议保存为UTF-8无BOM。带BOM的UTF-8和ANSI编码都可能在解析时出幺蛾子,症状是addin被忽略,插件不出现,且没有任何报错。
3.4 启动Revit确认插件入口
放好文件后启动Revit 2020,观察两个地方。
第一,启动过程中有没有弹“外部工具加载失败”对话框。有弹窗,说明addin已经被扫描到,但dll加载失败,回第4章按诊断流程查;没弹窗,说明大概率已经加载成功。
第二,启动完成后打开一个项目,切到“附加模块”选项卡。RevitLookup加载成功后会在这里生成一个RevitLookup面板,面板上有Snoop DB、Snoop Current Selection等按钮。面板出现,安装已经成功了一大半。
为什么说一大半?因为Revit对插件加载是延迟初始化机制,外部应用在启动时执行Load,但按钮点击后的逻辑要等真正操作时才会执行。面板出现只代表程序集加载没崩,功能完整性要实际点按钮验证。第5章专门说验证流程。
4. 常见问题排查:加载失败、命令缺失、版本冲突
4.1 Revit启动时弹出“加载外部工具失败”
现象:Revit 2020启动过程中弹对话框,提示外部工具加载失败,错误信息里能看到RevitLookup字样。
原因:最常见是addin文件里 节点写的文件名和实际dll文件名不一致。比如addin里写RevitLookup.dll,实际文件叫RevitLookup2020.dll,CLR找不到程序集自然失败。第二种常见原因是dll引用的.NET Framework版本高于系统当前版本,这类错误在事件查看器的.NET Runtime日志里能看到FileLoadException或MethodNotFoundException。
解决:先打开addin文件,对照 节点和实际dll文件名,不一致就改成一致;再跑一遍2.2的PowerShell命令确认.NET版本;最后用dnSpy打开dll看目标框架。三个节点确认完重新启动Revit,大部分加载失败问题都出在这三处。
还有一种情况:RevitLookup.dll依赖某个第三方dll,比如JSON序列化库,这个依赖dll没一并复制到AddIns目录。Revit加载主dll时,CLR尝试解析依赖程序集失败,抛FileNotFoundException。这时候看Windows事件查看器里的.NET Runtime日志,里面有完整程序集解析失败路径,沿着提示把缺的依赖放进AddIns目录即可。
4.2 附加模块里找不到RevitLookup面板
现象:Revit启动没有任何报错,但打开项目后“附加模块”选项卡里没有RevitLookup面板。
原因:addin文件没被扫描到,或扫描到但XML解析失败被跳过。典型情况是文件放进了%AppData%\Autodesk\Revit\Addins\2021\,而当前Revit是2020;另一种是XML标签缺闭合,整个文件失效。
解决:分两步。第一步,确认addin文件在2020目录,不是2019也不是2021,路径里两个年份都要对。第二步,用浏览器打开addin文件(浏览器对XML语法检查比较直观),看有没有解析报错。两步都通过后,把addin另存为UTF-8无BOM编码,覆盖原文件,重启Revit。
如果重启后仍然没有面板,还有一个隐蔽检查点:addin文件第一行的encoding属性写的是不是utf-8。如果写的是utf-16,或者根本没有声明编码,在中文Windows系统上解析时容易乱掉。把encoding统一改成utf-8再保存,大概率能解决。
4.3 源码编译报错:API版本和引用路径问题
现象:用Visual Studio打开源码工程,编译时大量报错,错误集中出现在Autodesk.Revit命名空间相关代码上。
原因:源码工程预期引用Revit 2020的API程序集,但开发机上Visual Studio的引用路径可能指向了Revit 2021或2022的API程序集。更隐蔽的是,某些NuGet缓存里存的是旧版API dll,编译器用了旧版参考,生成的新版运行时报错。
解决:在解决方案资源管理器里展开每个项目的“引用”节点,删掉所有指向Autodesk.Revit的引用项,重新添加。Revit 2020的API程序集路径:
C:\Program Files\Autodesk\Revit 2020\RevitAPI.dll C:\Program Files\Autodesk\Revit 2020\RevitAPIUI.dll添加引用的方式是:右键项目→添加引用→浏览→定位这两个文件→确定。然后检查每个.csproj里的TargetFrameworkVersion是否为4.7或4.7.2,是4.5的要改高再编译。编译成功后生成的dll在bin\Release目录下,把它复制到AddIns目录覆盖旧dll,重启Revit验证。
还有一招,源码工程里的配置管理器确认编译目标是AnyCPU。Revit 2020是64位进程,x86编译产物加载时会直接报“试图加载格式不正确的程序”。这个问题在代码里看不出来,只在运行时炸。
4.4 安全软件隔离插件dll
现象:RevitLookup第一次能加载,隔几天突然加载失败,或者同一配置文件在这台机器上能用,另一台不行。
原因:Windows Defender或第三方杀毒软件把AddIns目录下的插件dll识别为可疑文件,自动隔离。RevitLookup这种深度反射调用API的插件,行为特征确实容易被误判。
解决:把%AppData%\Autodesk\Revit\Addins\2020\目录加进Windows Defender排除列表。操作路径:设置→更新和安全→Windows安全中心→病毒和威胁防护→管理设置→排除项→添加排除项→文件夹,选这个目录。如果文件已经被隔离,先在“保护历史记录”里恢复,再加排除列表,最后重启Revit。
这个坑在BIM团队环境里很常见,IT部门统一下发的安全策略默认隔离所有未签名的插件dll。个人开发机好办,公司管控机器就得走IT审批流程,把插件dll加白名单,或者申请本地管理员权限装一次。碰到这个问题不用怀疑插件本体,先看安全软件日志再动手。
5. 验证安装:用Snoop DB把元素参数看个透
5.1 从选择元素到Snoop窗体的操作路径
插件装没装好,最终要看功能能不能跑通,而不是只看面板上有没有按钮。验证顺序我习惯固定走一遍:先确认启动无弹窗,再确认面板存在,然后实际操作一次Snoop。
打开Revit 2020,新建一个空白项目,画一面墙,选中它。切到“附加模块”选项卡,在RevitLookup面板里点Snoop Current Selection。能正常弹出Snoop窗口,说明插件核心引用链路完整。
弹出的窗口左侧是对象树,右侧是属性细节,顶部能看到当前元素的类型信息。
5.2 Snoop结果里能看到的四类信息
Snoop窗口的树层级结构大体分四层,每一层对应一个API概念:
| 对象层 | 对应API | 能确认什么 |
|---|---|---|
| Element层 | Element.Class / Category | 当前元素类型、类别 |
| Parameters层 | Element.Parameters | 所有实例参数和类型参数 |
| Geometry层 | Element.get_Geometry() | 几何体的Solid/Curve等数据 |
| Internal层 | 内部API | Handle、UniqueId等底层信息 |
实际排查时最常用的是Parameters层。展开Parameters节点,能看到这个元素的全部参数——系统内置参数和项目参数都列出来,每个参数标了名称、存储类型(StorageType)、当前值。这些信息在代码调试里要写循环才能列全,在Snoop DB里点两下就有了。
一个实用验证点:选中参数看右侧StorageType,如果它是ElementId类型,说明该参数的值在数据库里指向另一个元素,这在排查“参数取出来怎么是别的对象”时极其有用。
5.3 验证完再开工的习惯
除了能弹Snoop窗口,还建议确认三点:切换选择时窗口内容能跟随刷新;用Snoop DB按钮能列出整个数据库的类别树;对一个带曲面或体量的元素Snoop时不崩溃。第三点真正验证插件在真实项目数据上的稳定性,如果曲面元素直接崩溃,说明插件包可能混入了不匹配的元素解析逻辑。
从那以后我每次换环境,都强制自己走一遍:启动看弹窗、Snoop Current Selection看弹出、Parameters看参数值,三步加起来不到两分钟,却能把“插件没装好”这个模糊问题收敛成具体点位。因为省略验证流程而掉进坑里的次数实在太多,好几次都是调了半天才发现是插件版本和Revit不匹配。这套流程也适用于其他Revit插件环境,希望帮到你。
本文还有配套的精品资源,点击获取