OpenEdge Progress Developer Studio中含.NET Dictionary<String,Object>参数的C#函数XML导入文档缺失问题
从你的描述来看,核心问题很明确:你在OpenEdge Progress Developer Studio (V4.5.2)中导入带Dictionary<String, Object>参数的C#函数后,Class Browser能正常识别函数但无法加载对应的XML注释,而其他无泛型参数的函数注释显示正常,且所有函数调用都没问题。
为什么会出现这个问题?
大概率是OpenEdge在解析.NET程序集的XML注释时,对泛型类型的签名匹配逻辑比较严格。你生成的XML里,函数签名用的是.NET XML注释标准的{}来包裹泛型参数:
M:Namespacename.Classname.TestFunctionWInputDictionary(System.Collections.Generic.Dictionary{System.String,System.Object})
但OpenEdge在识别该函数时,会把.NET String映射成自己的character类型,同时可能期望泛型参数用<>格式表示,这就导致XML里的签名和OpenEdge内部识别的签名不匹配,无法关联到注释内容。
具体的解决办法
1. 手动修改XML注释的泛型签名格式
这是最直接的尝试方案:把XML中泛型参数的{}替换成<>,修改后的节点如下:
<member name="M:Namespacename.Classname.TestFunctionWInputDictionary(System.Collections.Generic.Dictionary<System.String,System.Object>)"> <summary>Summary Text of my function</summary> <remarks>Something remarkable</remarks> <param name="mydictionary">dict description</param> <returns>String Return</returns> </member>
修改完成后,替换原XML文件,然后在OpenEdge中右键点击程序集项目,选择Rebuild Assembly Project Model,再打开Class Browser检查注释是否正常显示。
2. 确认OpenEdge的.NET类型映射设置
有时候类型映射的异常也会导致签名匹配失败:
- 打开OpenEdge的Tools > Options > Progress OpenEdge > .NET Integration
- 在Type Mappings面板里,确认
System.String的映射目标是character,System.Object映射到自身(这是默认设置,但可以检查是否被修改过) - 保存设置后,重新导入程序集并重建模型
3. 临时替代方案:改用非泛型Hashtable
如果上述方法都无效,作为紧急临时方案,可以把C#函数的参数从Dictionary<String, Object>改成Hashtable,同步更新XML注释后重新编译生成dll。OpenEdge对非泛型的.NET集合类型注释支持更稳定,应该能正常显示注释。
4. 考虑升级OpenEdge版本
OpenEdge V4.5.2是比较老旧的版本,对.NET新特性(比如泛型注释的解析)可能存在兼容性bug。如果条件允许,升级到较新的版本(比如11.7及以上),大概率能解决这类兼容性问题。
验证流程
每次修改后,务必按以下步骤操作:
- 替换更新后的dll和XML到项目的Assemblies文件夹
- 重建程序集项目模型(这一步很关键,否则OpenEdge不会加载新的注释)
- 打开Class Browser,定位到目标函数查看注释状态
内容的提问来源于stack exchange,提问作者D3adC0de

