如何编译pjsip并在Visual Studio的C#项目中作为dll使用
编译pjsip为DLL并在Visual Studio C#项目中使用操作指南
前置准备
- 安装Visual Studio 2019/2022社区版,安装时必须勾选「使用C++的桌面开发」工作负载,确保MSVC编译器、对应版本Windows SDK已安装
- 下载pjsip源码包,解压到无中文、无空格的本地路径,例如
D:\pjsip-source
步骤1:编译pjsip为动态链接库(DLL)
- 进入pjsip源码根目录,找到
pjlib/include/pj/config_site.h文件,若文件不存在则手动新建,写入以下配置内容:
#define PJ_DLL 1
#define PJ_EXPORT_DECL_SPECIFIER __declspec(dllexport)
#define PJ_IMPORT_DECL_SPECIFIER __declspec(dllimport)
- 打开对应版本VS的原生工具命令提示符,64位编译选择「x64 Native Tools Command Prompt for VS 20XX」,32位编译选择「x86 Native Tools Command Prompt for VS 20XX」,禁止使用普通cmd窗口执行编译
- 在命令行中cd到pjsip源码根目录,执行配置命令:
- 64位编译:
configure-vs.cmd - 32位编译:
configure-vs.cmd x86
- 64位编译:
- 执行编译命令:
nmake all,等待编译完成无报错后,生成的所有DLL、LIB文件会存放在源码根目录下的lib文件夹内
步骤2:C#项目中调用pjsip DLL
- 打开你的Visual Studio C#项目,右键项目→「属性」→「生成」,将目标平台设置为和pjsip编译架构完全一致(x64/x86),架构不匹配会直接导致调用失败
- 将pjsip编译生成的全部
.dll文件复制到C#项目的输出目录中,默认输出目录为bin\Debug\netX.X或bin\x64\Debug - 在C#代码中通过P/Invoke声明需要调用的pjsip接口,示例如下:
using System.Runtime.InteropServices; // 声明pjsip接口,注意CallingConvention必须指定为Cdecl [DllImport("pjlib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int pj_init();
- 运行项目前确认所有依赖DLL都在运行目录,即可正常调用pjsip接口实现对应功能
常见问题排查
- 编译pjsip时报错:先检查源码路径是否存在中文、空格,VS的C++桌面开发组件是否完整安装
- C#运行提示「找不到指定的DLL」:检查目标平台是否匹配,所有pjsip相关DLL是否都放在程序运行目录
- 调用接口时出现堆栈不平衡报错:检查
DllImport特性中是否指定了CallingConvention = CallingConvention.Cdecl
内容的提问来源于stack exchange,提问作者Khaled Janky
相关产品推荐
相关产品推荐

