OpenEdge环境加载自定义PCControl DLL时出现「Unknown table name PCControl. (200)」错误的技术求助
OpenEdge加载自定义DLL提示“Unknown table name PCControl. (200)”的排查与解决
针对你遇到的这个问题,我先梳理下核心矛盾:你的PCControl.dll代码本身没问题(放到同事的DLL里能正常运行),但自己单独部署时,OpenEdge却把它当成不存在的表来报错——这说明OpenEdge根本没把它识别成.NET程序集,而是误判成了数据库表。结合你的配置细节,我整理了几个针对性的排查步骤:
一、先检查ProAsmRef生成的代理类是否有效
当你用ProAsmRef处理PCControl.dll时,它会生成对应的OpenEdge代理.p文件,这个文件是OpenEdge和.NET交互的桥梁。你需要确认:
- 代理文件已经成功生成,并且没有报错。运行ProAsmRef时注意看控制台输出,如果有依赖缺失或者生成失败的提示,那就是根源。
- 生成的代理
.p文件已经被编译成.r文件,并且这个.r文件所在的路径在PROPATH中。如果代理类没编译,或者路径不对,OpenEdge找不到对应的类定义,就会报错“未知表名”。 - 打开代理文件看看,里面应该有
NAMESPACE PCControl和CLASS PCC的定义,以及AzureLogin方法的声明。如果这些内容缺失,说明代理生成失败了。
二、核对assemblies.xml的配置细节
你的assemblies.xml里已经加了PCControl的条目,但有几个细节容易出错:
- 确认
name属性里的版本号、PublicKeyToken和你的PCControl.dll完全匹配。可以用.NET的sn -T PCControl.dll工具查看公钥令牌,或者在Visual Studio的项目属性里检查程序集版本,确保和配置里的1.0.0.0、PublicKeyToken=null一致。 - 检查assemblies.xml的存放位置:OpenEdge会从启动目录、PROPATH路径里查找这个文件。你可以把它复制到login.p所在的目录,或者OpenEdge的bin目录,避免路径读取问题。
- 另外,System.DirectoryServices.dll的版本也要确认——你配置的是
4.0.0.0,要和你C#项目中引用的版本一致,否则会导致依赖加载失败。
三、检查DLL的部署路径和依赖项
OpenEdge加载.NET程序集时,会遵循.NET的程序集加载规则,除了PROPATH,还要注意:
- 把PCControl.dll放到OpenEdge的bin目录(比如
C:\Progress\OpenEdge\bin)试试,系统级路径的加载优先级更高,能避开PROPATH的潜在问题。 - 确认PCControl.dll的依赖项都能被找到:你用到了System.DirectoryServices和Microsoft.Office.Interop.Outlook,前者要确保版本匹配且路径正确,后者如果是通过NuGet引用的,要确认Interop DLL是否在同一目录,或者已经注册到GAC。
四、修正OpenEdge代码中的USING和调用方式
你提到用了USING PCControl.*,但要注意这个语句的作用域:
- USING必须放在代码的最顶部,在任何PROCEDURE或者DEFINE语句之前,否则作用域不生效。比如正确的写法应该是:
USING PCControl.*. &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE Login C-Win PROCEDURE Login : DEF VAR lSuccess AS CHAR NO-UNDO. -- 这里直接用类名即可,不需要加命名空间 lSuccess = PCC:AzureLogin("arorap1", "12345"). MESSAGE lSuccess VIEW-AS ALERT-BOX INFO TITLE "ok". END PROCEDURE. &ANALYZE-RESUME
- 如果还是有问题,尝试用完整的命名空间调用,避开USING的影响:
lSuccess = PCControl.PCC:AzureLogin("arorap1", "12345")。
五、排查ProAsmRef的执行日志
运行ProAsmRef.exe时,控制台会输出详细日志,你可以仔细看看有没有关于PCControl.dll的错误信息——比如“无法加载依赖项”“生成代理类失败”之类的提示,这些日志能直接定位问题。如果有错误,修复后重新生成代理和配置文件。
既然把函数放到同事的DLL里能正常运行,说明你的C#逻辑完全没问题,问题肯定出在PCControl.dll的代理生成、配置或者部署环节。按照上面的步骤逐一排查,应该能快速解决这个200错误。
内容的提问来源于stack exchange,提问作者Raphael Frei
相关产品推荐
相关产品推荐

