如何将PowerBuilder编译生成的DLL导入C#项目并实现引用调用
C# 调用无源码PowerBuilder编译生成DLL的解决方案
PowerBuilder 编译生成的DLL默认属于非托管程序集,不属于.NET托管类库,因此无法直接通过VS的「添加引用」功能直接导入托管项目使用,可按以下两种方案尝试:
方案1:COM组件类型PB DLL调用
如果该DLL是PowerBuilder编译时勾选了COM组件选项生成的,可按以下步骤操作:
- 打开系统命令行,执行
regsvr32 你的DLL完整路径命令,如果提示注册成功,说明该DLL为标准COM组件 - 回到VS的添加引用界面,切换到「COM」选项卡,找到对应名称的组件添加即可,添加后可直接在代码中调用文档里的API
- 如果提示注册失败,说明该DLL不是COM类型,走方案2
方案2:非COM类型PB DLL通过P/Invoke调用
如果是标准非托管导出DLL,使用.NET平台的P/Invoke机制即可调用:
- 先对照你持有的PB环境API文档,确认每个要调用的函数的调用约定、参数列表、返回值类型,参数类型匹配是调用成功的核心
- 在C#类中使用
[DllImport]特性声明外部函数,示例代码如下:
using System.Runtime.InteropServices; // 注意:如果DLL没有放在程序运行目录,需要写完整绝对路径;CallingConvention根据PB导出的约定调整,默认一般为StdCall [DllImport("你的PB DLL文件名.dll", CallingConvention = CallingConvention.StdCall)] // 这里的函数名、参数、返回值要和PB导出的完全对应 public static extern int 函数名(参数类型 参数名);
- 常见类型映射参考:PB的
string对应C#的string(输入参数)/StringBuilder(输出参数),PB的long对应C#的int,PB的boolean对应C#的bool,如果涉及结构体参数需要在C#中定义内存布局一致的结构体
调用失败排查要点
- 平台架构匹配:如果PB DLL是32位编译的,C#项目的生成目标平台要设置为x86;64位的对应设置为x64,不要使用Any CPU,否则会提示找不到DLL
- 依赖补全:PB编译的DLL默认依赖对应版本的PB运行时库,例如PB12生成的DLL依赖PBVM120.dll等文件,需要将对应运行时DLL和你的PB DLL一起放到程序运行目录
- 特殊参数限制:如果API涉及PowerBuilder特有的对象类型参数,无源码的情况下无法直接在C#中定义匹配类型,优先选择参数为普通数值、字符串、布尔类型的API调用
内容的提问来源于stack exchange,提问作者SHYLI
相关产品推荐
相关产品推荐

