:环境盘点与开发前自检——Command Window、PMLLIB 与 CAF 环境变量)
版本声明全系列统一口径本篇基线为AVEVA E3D Design 3.1帮助站可确认的文档版本线为1.1 / 2.1 / 3.1docs.aveva.com的版本索引把当前版本列为 E3D Design 3.1。AVEVA PDMS 自 2024 年 4 月 1 日起不再销售、不再提供支持本系列不把它作为新开发目标。正文中的环境变量名、界面路径、文档入口均出自官方文档凡来自 AVEVA Community 或第三方博客的内容一律标注来源性质凡按官方 API 或环境变量名构造、未在本机跑通的代码一律标注**“需在本地 E3D Design 环境验证”**。官方未公开的项官方示例下载页、独立 Core/Core3D API 参考站、公开免费试用或下载页只写官方未公开。一句话结论开发前自检只解决四个问题——版本对不对、入口找不找得到、路径通不通、示例工程在不在这四件事全部可以在 30 分钟内用一条 PowerShell 脚本加一个 PML 探针验完而跳过它们的人通常会在写完几百行代码之后才发现根因在环境。〇认知问题我要装的到底是哪个版本怎么确认我手上这套是 E3D Design 3.1 而不是别的什么东西官方让写 PML 的那个命令行窗口官方到底叫什么名字为什么我在文档里搜 “PML Console” 一条都搜不到PMLLIB到底管什么为什么我在别的机器上能跑的函数搬到这台就不认了CAF 那四个环境变量分别控制什么不设会怎样官方示例代码到哪里去找网上搜到的示例仓库可信吗四本二次开发手册各管什么我应该先翻哪一本一机制解析1.1 版本线怎么确认三轮验证不靠记忆版本对齐是铁律但对齐需要一个可执行的确认动作。建议做三轮第一轮看文档版本号。打开 https://help.aveva.com/AVEVA_Everything3D/3.1/GS/GS_FP.htmlURL 里的3.1就是文档版本。把3.1手工改成1.1、2.1也能打开说明三代文档都在线上——这也正是不能凭能打开就算存在来判断版本的原因。要拿权威口径看docs.aveva.com的版本索引它把当前版本列为E3D Design 3.1https://docs.aveva.com/bundle/system-platform-2023-r2-sp1。第二轮看安装侧证据。环境变量AVEVA_DESIGN_EXE指向 E3D Design 安装目录官方 NCUG 3.04.3 把它列为关键环境变量之一。列出该目录下的可执行文件与版本信息是最直接的现场证据。第三轮排除误判项。这一步专门用来打掉三种常见错觉“我装的是 15.x”—— 15.x 是AVEVA Engineering的版本不是 E3D Design。文档站在同一页会同时列出 “E3D Design 3.1” 与 “Engineering 15.8” 这类条目https://docs.aveva.com/bundle/system-platform-2023-r2-sp1。“帮助站页面能打开就等于这个版本存在”——docs.aveva.com对版本化 slug如/bundle/e3d-design-3-1会统一返回 200 的 SPA 兜底页但这些 slug 在 sitemap 中并不存在。200 不能作为版本存在的证据。“我装的是最新版”—— 官方发布页 https://www.aveva.com/en/info/e3d-design-releases/ 只回溯到 2022 年 2 月2023–2026 的发布条目在公开页面未找到能确认的是 3.1.4.02022-02MultiCAD、Work Packs、Space Management、Rule Manager 扩展与 3.1.5.02022-04Graphical Explorer、通过 PMLNETCALLABLE 导入 ML.NET 模型。还有一条必须提前知道的授权前提官方未公开E3D/PDMS 的公开免费试用或下载页只有 Demo 申请渠道。这直接影响你的开发方式——很多团队是开发机一套、测试 MDB 一套如果没有可写的测试库写库操作只能在正式库上做风险极高。1.2 官方入口名是 Command Window不是 “PML Console”这是本系列第一个必须纠正的习惯用法因为它会直接影响你的检索效率。官方名称是 Command Window命令窗口。GS 手册原文给的是界面路径Tools 标签 → Display 组 → 点击 Commands打开 Command Windowhttps://help.aveva.com/AVEVA_Everything3D/3.1/GS/GS6.6.8.html。实测在 3.1 版 GS 目录中检索 “Console”零命中。为什么这件事重要因为你在网上能看到大量PML 控制台的写法一旦按这个词去搜官方文档命中率会非常低于是很多人转而依赖第三方教程最终把未经核实的语法写进生产脚本。本篇之后的全部内容一律统一写 “Command Window”。1.3 环境变量PMLLIB 与四个 CAF 变量PMLLIB是 PML 的搜索路径环境变量PML 的函数、表单、对象文件按官方培训材料口径为.pmlfnc、.pmlfrm、.pmlobj就靠它定位。它的典型症状非常好认同一份代码在 A 机器能跑、在 B 机器报找不到函数。绝大多数情况下不是代码问题而是 B 机器的PMLLIB少了一个路径段。四个 CAF 环境变量官方 NCUG 3.04.3https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG3.04.3.html变量作用不设的后果AVEVA_DESIGN_EXEE3D Design 安装目录PML.NET 找不到要载入的程序集其查找路径含%AVEVA_DESIGN_EXE%目录及其子目录CAF_ADDINS_PATHAddin 所在位置覆盖模块名Addins.xml的默认位置默认与可执行文件同目录自定义 dll 不被加载菜单点了没反应CAF_UIC_PATH界面定义文件位置按模块名Customisation.xml查找并列出.uic自定义菜单/工具栏不出现AVEVA_CAF_TRACING开发期跟踪开关出问题时没有跟踪信息排错只能猜其中CAF_ADDINS_PATH支持以;分隔多个路径也支持UNC 路径官方 NCUG 2.03.10https://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG2.03.10.html。关于装载配置还有一条必须记住的规则每个 CAF 应用有一个模块名Addins.xml例如MODEL 模块对应DesignAddins.xml默认与可执行文件同目录。实践建议本系列一致口径所有环境变量统一在启动脚本里设好不靠个人机器的系统属性。理由很直接——个人机器配置不可复现、不可审计一旦换人接手环境就莫名失效。1.4 安装目录里的 Samples.zip 与可信资源边界官方示例代码包的位置安装目录AVEVA_DESIGN_EXE所指向的目录下的Samples.zip内含 C# 源码与 Visual Studio 工程。官方文档中给出的示例工程名有AttributeBrowserAddin、ExamplesAddin、FlexibleExplorerAddin、NetGridExample、PMLNetExample、PMLGridExamplehttps://help.aveva.com/AVEVA_Everything3D/3.1/NCUG/NCUG_FP.html、NCUG2.03.02.html。这里必须划一条线AVEVA 官方 GitHub 组织下公开的 PML/.NET 示例仓库或示例下载页未找到官方示例的确认渠道只有Samples.zip。因此任何声称这是 AVEVA 官方 GitHub 示例库的链接都需要你自行核实来源性质。可以引用的第三方资源均明确标注为第三方非官方VS Code 扩展mikhalchankasm/vscode-pml-aveva-e3dAVEVA E3D PML 的 LSP 语言服务器 VS Code 扩展MIT 许可提供 PML1/PML2 语法高亮、IntelliSense、表单/回调 CodeLens支持.pml/.pmlobj/.pmlfnc/.pmlfrm/.pmlmac/.pmlcmdhttps://github.com/mikhalchankasm/vscode-pml-aveva-e3d。PyPI 包pyavevae3dextPython 侧访问 E3D 的桥接库提供GetPmlString/GetPmlReal/GetPmlBool等取值方法https://pypi.org/project/pyavevae3dext/。1.5 四本手册各管什么手册代号什么时候翻它.NET Customisation User GuideNCUG写 .NET Addin、Command、UIC、DbElement、PML.NET 时PML Customisation User GuidePMLCG写 PML/PML2 时控制逻辑、宏、表单、回调、命令、错误处理Software CustomisationSCRM查这个对象有哪些成员和方法时对象/成员/方法总参考AVEVA CAF API 参考—查 CAF API 类型签名时唯一公开的独立 API 参考站PMLCG 的正式章节名可直接当检索关键词使用Introduction、Variables/Objects/Functions and Methods、General Features of PML、PML Expressions、Control Logic、Arrays、Macros、Using PML in AVEVA Products、Errors and Error Handling、Developing PML Code、Form Concepts、Form and Gadget Callbacks、Forms、Commands、Form Layout、Menus、Frames、Gadgets and their Attributes、Alert Objects、FMSYS/CMSYS Object、PML Add-ins、Core Managed Objects、Flexible Explorer Controlhttps://help.aveva.com/AVEVA_Everything3D/3.1/PMLPUG/PMLCG_FP.html。SCRM 的章节为Summary of Objects, Members and Methods / Methods Available to All Objects / Forms and Menus Objects / Summary of Gadget-Specific Methods / Gadget Syntax Graphs / Object Type Details。另外三本常被忽略但很有用的手册Getting StartedGS、Database ManagementDBRM含 Expressions 章、DRAW 参考DRUGP。1.6 开发前自检清单#检查项通过标准不通过的处置1产品与版本能说清本机是 E3D Design 3.1 文档线并能排除 15.x 误判回到 1.1 的三轮验证2Command Window能从 Tools → Display → Commands 打开并能执行一行命令确认模块已进入 Design/MODEL 环境3PMLLIB探针宏能被$m/...调起.pmlfnc里的函数能被调用检查路径分隔与拼写逐个路径段验证4AVEVA_DESIGN_EXE变量可读且指向真实存在的安装目录在启动脚本里显式设置5CAF_ADDINS_PATH/CAF_UIC_PATH变量可读路径存在;分隔正确同上6AVEVA_CAF_TRACING知道在哪打开、在哪看输出查本地 NCUG 3.04.37Samples.zip在安装目录找到该压缩包能列出官方示例工程名联系本地管理员索取安装包8四本手册入口四个 URL 均能打开且正文可读优先help.aveva.com换用docs.aveva.com做检索式跳转9测试 MDB有一个可写、可回退的测试模型库没有测试库就不要做写库操作10版本控制自定义 PML 与 dll 已入库先建仓库再写第一行代码二完整代码与逐行剖析2.1 PowerShell 环境自检脚本把下面这段存成e3d-dev-check.ps1在开发机上运行。它只做读和打印不改动任何系统设置。# E3D 二次开发环境自检脚本只读不做任何系统改动# 注意路径请按本机实际安装位置修改# --- 1) 设置本次会话的环境变量若已在启动脚本里设好可跳过---$env:PMLLIB D:\AVEVA\E3D31\PMLLIB# PML 搜索路径可用 ; 分隔多段$env:AVEVA_DESIGN_EXE C:\Program Files\AVEVA\E3D Design 3.1# 安装目录$env:CAF_ADDINS_PATH D:\E3DDev\addins# Addin 位置覆盖默认可 ; 分隔、可用 UNC$env:CAF_UIC_PATH D:\E3DDev\uic# UIC 界面定义文件位置# $env:AVEVA_CAF_TRACING ... # 开发期跟踪开关启用值与输出位置请以本机 NCUG 3.04.3 为准# --- 2) 逐个检查变量是否可读、路径是否存在 ---$namesPMLLIB,AVEVA_DESIGN_EXE,CAF_ADDINS_PATH,CAF_UIC_PATH,AVEVA_CAF_TRACINGforeach($nin$names){$v[Environment]::GetEnvironmentVariable($n)if([string]::IsNullOrWhiteSpace($v)){Write-Host([未设置] {0}-f$n)-ForegroundColor Yellowcontinue}# 某些变量是路径列表; 分隔逐个判断存在性$segs$v-split;foreach($sin$segs){if(Test-Path-LiteralPath$s){Write-Host([ 存在] {0} - {1}-f$n,$s)-ForegroundColor Green}else{Write-Host([ 不存在] {0} - {1}-f$n,$s)-ForegroundColor Red}}}# --- 3) 列出安装目录下的可执行文件与版本信息不做任何推断---$dir$env:AVEVA_DESIGN_EXEif($dir-and(Test-Path-LiteralPath$dir)){Write-Hostn安装目录下的可执行文件取前 20 条-ForegroundColor CyanGet-ChildItem-LiteralPath$dir-Filter*.exe-File-ErrorAction SilentlyContinue|Select-Object-First 20|ForEach-Object{{0,-45} {1}-f$_.Name,$_.VersionInfo.FileVersion}}else{Write-HostAVEVA_DESIGN_EXE 未指向有效目录无法列表。-ForegroundColor Red}# --- 4) 查找官方示例包 Samples.zip ---if($dir-and(Test-Path-LiteralPath$dir)){$zipGet-ChildItem-LiteralPath$dir-FilterSamples.zip-File-Recurse-Depth 1-ErrorAction SilentlyContinueif($zip){Write-Hostn找到官方示例包-ForegroundColor Green$zip|ForEach-Object{$_.FullName}}else{Write-Hostn未在安装目录附近找到 Samples.zip请向本机管理员确认安装包完整性。-ForegroundColor Yellow}}逐段剖析第一段是会话级环境变量设置。放在脚本里而不是系统属性里符合环境可复现的要求PMLLIB与CAF_ADDINS_PATH都支持;分隔多段。第二段用[Environment]::GetEnvironmentVariable读取进程级变量逐个打印存在 / 不存在。这是把我以为设了变成我看见了的关键一步。第三段列出安装目录下的*.exe及其VersionInfo.FileVersion。这里刻意不做任何版本 x.y的推断只是把现场证据摆出来给你判断——因为 AVEVA 官方产品页并没有列出 PDMS 的版本号清单凭文件名猜版本是常见的误判来源。第四段查找Samples.zip。官方示例的确认渠道就是它找不到就说明安装包或环境有问题。注意脚本中的路径是占位示例需在本地 E3D Design 环境下按实际安装位置修改并验证。2.2 PML 侧探针宏在PMLLIB覆盖的任一路径下建一个目录比如probe放两个文件。第一个文件pmllibtarget.pmlfnc用来验证函数能不能被找到-- 文件pmllibtarget.pmlfnc -- 用途探针函数用来验证 PMLLIB 是否包含本目录 -- 说明本函数由教程按官方 .pmlfnc 写法构造需在本地 E3D Design 环境验证 define function !!probeTag() is STRING return PMLLIB-OK endfunction第二个文件selfcheck.mac用$m/调起-- 文件selfcheck.mac -- 用途环境自检宏。逐行执行观察 Command Window 的回显。 -- 来源写法沿用官方培训材料中的宏调用与查询形式 P ---- begin selfcheck ---- -- 1) 验证 PMLLIB能调起说明该路径已在 PMLLIB 中 !tag !!probeTag() q var !tag -- 2) 导出当前元素的关键属性这些属性名出自官方文档与培训材料的真实示例 q var !!ce.flnn q var !!ce.name q var !!ce.type q var !!ce.position P ---- end selfcheck ----逐行剖析P ...PML 的输出命令用于把后面这串内容打到 Command Window。本篇用它做分段与标签是因为它在官方示例里出现过官方控制逻辑示例中的P CE is Branch.。!tag !!probeTag()调用上面那个函数并把返回值赋给局部变量。这一行是探针的核心——如果PMLLIB里没有包含存放pmllibtarget.pmlfnc的目录这一行就会失败从而把路径没配好这件事变成一个可见的报错。写法上刻意只用两种已被官方示例证实的形态函数调用与赋值官方示例!area !!area(12, 200)不做行内$注入避免把未验证的组合写法混进排错工具里。q var !tag以变量形式打印!tag官方示例q var !!ce.flnn、社区宏里的q var !q都是这个用法。看到PMLLIB-OK就说明PMLLIB覆盖到了该目录。q var !!ce.flnn/q var !!ce.name/q var !!ce.type/q var !!ce.position!!ce是跟踪当前元素的全局变量flnn、name、type、position四个属性名均出自官方的真实示例代码q var !!ce.flnn出现在官方表单示例的方法体里!!ce.name、!!ce.type、!!ce.position出现在官方对象示例GETELEMENTINFORMATION中。关于版本信息在本篇所依据的官方材料范围内没有找到在 PML 侧直接打印产品版本号的已核实命令或方法名。因此版本核验请放在系统侧完成2.1 的脚本 帮助站 URL 版本号不要在脚本里臆造一个打印版本的命令。运行方式按官方培训材料口径$M/%PDMSUI%\examples\simpleMac.mac或$m/FILENAME——把FILENAME换成你的selfcheck.mac全路径。2.3 C# 侧读取 AVEVA_DESIGN_EXE这一段用来验证企业侧程序能否读到 AVEVA 环境。它是一个普通控制台程序不依赖 E3D 进程。usingSystem;usingSystem.IO;// 用途在企业侧程序里读取 AVEVA 关键环境变量做环境就绪前置判断。// 说明环境变量名取自官方 NCUG 3.04.3本程序按标准 .NET 写法构造// 需在本地 E3D Design 环境验证尤其是变量是否在进程级可见。classEnvProbe{staticvoidMain(){string[]names{AVEVA_DESIGN_EXE,CAF_ADDINS_PATH,CAF_UIC_PATH,PMLLIB};foreach(stringninnames){stringvEnvironment.GetEnvironmentVariable(n);// 进程级读取if(string.IsNullOrWhiteSpace(v)){Console.WriteLine([未设置] n);continue;}// CAF_ADDINS_PATH 与 PMLLIB 可能是 ; 分隔的路径列表foreach(stringseginv.Split(;)){stringsseg.Trim();if(s.Length0)continue;Console.WriteLine((Directory.Exists(s)?[ 存在]:[不存在]) n - s);}}}}逐行剖析Environment.GetEnvironmentVariable(n)读取当前进程可见的环境变量。这里有一个非常容易忽略的前提——从外部程序启动 E3D 时环境变量必须在进程级就已经存在否则读到的会是空字符串。这也是启动脚本统一设变量这一实践的直接理由。v.Split(;)CAF_ADDINS_PATH官方支持;分隔多路径PMLLIB同理。逐个路径判断存在性比整体判断有用得多——因为只要有一段写错加载就会静默失败。不要在这段程序里用Directory.GetFiles去猜程序集名。程序集名请从官方文档取值如Aveva.Core.Database.dll、Aveva.ApplicationFramework.dll而不是靠搜索文件名匹配——历史上 PDMS 12.0 时代用的是Pdms.Database.dll、PDMSFilters.dll靠模糊匹配极易把旧名当成新名。三常见报错与排查症状一函数调用失败提示找不到某个 PML 函数/对象。现象同样的.pmlfnc在同事机器上正常在你机器上找不到。原因PMLLIB未包含该文件所在目录或目录在PMLLIB中但拼写/分隔符有误;与空格混淆最常见。处置用 2.2 的探针宏跑一次确认probe tag PMLLIB-OK能打印出来随后逐段核对PMLLIB建议在脚本里把每个路径段单独Test-Path一次。统一在启动脚本里设变量不要依赖个人机器配置。症状二在官方文档里检索 “PML Console”、“Console” 零命中。现象想找PML 命令行窗口的官方说明搜不到。原因官方没有这个名称。官方入口名是Command Window路径为Tools 标签 → Display 组 → Commands官方 GS 手册 GS6.6.8。处置改用 “Command Window” 作为检索词在团队文档里也统一用这个名称避免新人在错误的路标上浪费半天。症状三自定义菜单/工具栏完全不出现。现象dll 编译通过模块名Addins.xmlMODEL 模块对应DesignAddins.xml也放了界面没有任何变化。原因CAF_ADDINS_PATH没有指向 dll 所在目录它覆盖默认的与可执行文件同目录或CAF_UIC_PATH没有指向含.uic的目录或模块名Customisation.xml的UICustomizationFiles里没列出你的 UIC注意其中的$1会被当前工程名替换路径写法必须考虑这一点。处置先按 2.1 脚本确认两个变量的每一段路径都存在再打开AVEVA_CAF_TRACING开发期跟踪看加载日志最后确认命令类的Key与 UIC 中的引用完全一致。症状四外部程序启动 E3D 之后Addin 报了读不到环境的错。现象手工启动 E3D 一切正常从企业系统里拉起来就异常。原因环境变量只设在了交互式 shell 里没有进入被启动进程的环境块。处置把环境变量写进启动脚本或服务配置用 2.3 的控制台程序在同一启动上下文里先跑一次验证确认无[未设置]再启动 E3D。四动手练习练习 115 分钟把 2.1 的脚本按你本机路径改好并运行。合格判定PMLLIB、AVEVA_DESIGN_EXE、CAF_ADDINS_PATH、CAF_UIC_PATH四个变量的每一段路径都打印为[存在]AVEVA_CAF_TRACING允许显示[未设置]但你必须能说清它在本地文档的哪一页说明。练习 215 分钟在 Command Window 里手工执行 2.2 的探针。合格判定能看到PMLLIB-OK被打印出来四个q var至少有三个打印出真实值若当前元素为空!!ce相关可能报错这本身也是正确结果记下报错原文即可。练习 310 分钟在安装目录里找到Samples.zip用解压工具列出其中的工程目录名并核对是否包含官方文档列出的示例工程AttributeBrowserAddin、ExamplesAddin、FlexibleExplorerAddin、NetGridExample、PMLNetExample、PMLGridExample。合格判定至少能对上 4 个名字对不上的部分记录为本机安装包版本差异。练习 410 分钟做一次来源性质标注训练。打开 https://github.com/mikhalchankasm/vscode-pml-aveva-e3d 和 https://pypi.org/project/pyavevae3dext/用一句话说清它们分别是什么、以及为什么它们不能被称为官方工具。合格判定能明确指出它们是可核实的第三方开源资源且官方示例的确认渠道只有安装目录下的Samples.zip。五小结与下一篇预告本篇把环境从感觉变成了证据版本要三轮验证文档版本号、安装侧证据、排除 15.x 与 200 兜底页误判官方唯一的 PML 交互入口是 Command WindowTools → Display → Commands文档里没有 “PML Console” 这个词PMLLIB管 PML 文件搜索四个 CAF 变量分别管安装目录、Addin 位置、UIC 位置与开发期跟踪官方示例只随Samples.zip提供官方 GitHub 示例库未找到。下一篇《第一个 PML 宏参数化宏与命令注入》会正式动手宏的三种调用形式、“宏没有参数声明参数就是行尾多写的东西”这一反直觉机制、以及如何把 PML 变量注入到命令字符串里去做参数化建模。文末 FAQQ1我要装的到底是哪个版本怎么确认我手上这套是 E3D Design 3.1 而不是别的什么东西看文档版本号如help.aveva.com/AVEVA_Everything3D/3.1/...中的3.1并以docs.aveva.com版本索引为准——它把当前版本列为 E3D Design 3.1。帮助站上可确认的文档版本线是 1.1 / 2.1 / 3.1 三代所以能打开某代文档不等于你装的是那一代。同时要在现场核对读环境变量AVEVA_DESIGN_EXE找到安装目录列出其中的可执行文件与版本信息作为现场证据。并且用排除法打掉误判15.x 是 AVEVA Engineering 的版本而非 E3Ddocs.aveva.com对不存在的版本化 slug 也会返回 HTTP 200 的 SPA 兜底页所以页面能打开不能作为版本存在的证据。Q2官方让写 PML 的那个命令行窗口官方到底叫什么名字为什么我在文档里搜 “PML Console” 一条都搜不到官方名称是Command Window命令窗口打开路径是Tools 标签 → Display 组 → 点击 Commands官方 Getting Started 手册 GS6.6.8。搜不到 “PML Console” 是因为官方根本没有这个名称——实测在 3.1 版 GS 目录中检索 “Console” 零命中。请统一使用 “Command Window” 作为书面与口头用词这也是本系列的一致性要求。Q3PMLLIB到底管什么为什么我在别的机器上能跑的函数搬到这台就不认了PMLLIB是 PML 的搜索路径环境变量PML 的函数.pmlfnc、表单.pmlfrm、对象.pmlobj文件靠它定位。跨机器失效的最常见原因是目标机器的PMLLIB缺少某个路径段或者路径列表的;分隔写错、把空格当成了分隔符。排查方法是写一个探针函数放进该目录、用$m/...调起宏来验证PMLLIB是否覆盖到该目录更稳妥的做法是把PMLLIB统一写在启动脚本里不依赖个人机器配置。Q4CAF 那四个环境变量分别控制什么不设会怎样按官方 NCUG 3.04.3AVEVA_DESIGN_EXE指向 E3D Design 安装目录也影响 PML.NET 的程序集查找路径不设则程序集可能载入失败CAF_ADDINS_PATH指定 Addin 位置、覆盖默认的与可执行文件同目录不设则你的 dll 不会被加载CAF_UIC_PATH指定界面定义文件位置、按模块名Customisation.xml查找并列出.uic不设则自定义菜单/工具栏不出现AVEVA_CAF_TRACING是开发期跟踪开关不设则出问题时缺少跟踪信息。注意CAF_ADDINS_PATH支持;分隔多路径也支持 UNC 路径。另外每个 CAF 应用有一个模块名Addins.xmlMODEL 模块对应的是DesignAddins.xml。Q5官方示例代码到哪里去找网上搜到的示例仓库可信吗官方示例的确认渠道是安装目录AVEVA_DESIGN_EXE所指目录下的Samples.zip内含 C# 源码与 Visual Studio 工程官方文档中出现的示例工程名有 AttributeBrowserAddin、ExamplesAddin、FlexibleExplorerAddin、NetGridExample、PMLNetExample、PMLGridExample。AVEVA 官方 GitHub 组织下公开的 PML/.NET 示例仓库或示例下载页未找到因此任何以官方 GitHub名义出现的仓库都需要自行核实来源。可以核实的第三方资源有 MIT 许可的 VS Code 扩展mikhalchankasm/vscode-pml-aveva-e3dPML LSP支持.pml/.pmlobj/.pmlfnc/.pmlfrm/.pmlmac/.pmlcmd和 PyPI 上的pyavevae3dext提供GetPmlString/GetPmlReal/GetPmlBool——它们都只能标注为第三方不能写成官方工具。Q6四本二次开发手册各管什么我应该先翻哪一本NCUG.NET Customisation User Guide管 .NET Addin、Command、UIC、DbElement、PML.NETPMLCGPML Customisation User Guide管 PML/PML2 的语言与控制逻辑、宏、表单、回调、命令、错误处理SCRMSoftware Customisation是对象/成员/方法总参考用来查这个对象有哪些成员和方法另有唯一公开的独立 API 参考站是 AVEVA CAF API 参考https://help.aveva.com/API/CAF/index.html。入门顺序建议先 PMLCG甚至只先看 Control Logic、Macros、Errors and Error Handling 三章写界面时再翻 SCRM 与 NCUG。检索时优先用help.aveva.com的静态页正文可直接抓取、可核对用docs.aveva.com做跳转检索。