求助:如何基于google/jpegli构建适配C# wrapper的DLL
如何基于jpegli静态库构建可供C#调用的动态链接库(DLL)
步骤1:创建C++ DLL项目(以Visual Studio为例)
- 打开Visual Studio,新建**动态链接库(DLL)**项目,命名为
jpegli-wrapper - 配置项目路径:
- 右键项目→属性→C/C++→常规→附加包含目录:添加jpegli源码的
include文件夹路径,以及vcpkg安装jpegli后的include路径 - 右键项目→属性→链接器→输入→附加依赖项:添加
jpegli-static.lib的完整路径
- 右键项目→属性→C/C++→常规→附加包含目录:添加jpegli源码的
步骤2:编写导出接口的C++代码
新建jpegli_wrapper.cpp文件,编写C风格导出函数(避免C++名字修饰,方便C#的PInvoke调用):
#include "jpegli/decode.h" #include "jpegli/encode.h" // 导出宏配置 #ifdef JPEGLI_WRAPPER_EXPORTS #define JPEGLI_WRAPPER_API __declspec(dllexport) #else #define JPEGLI_WRAPPER_API __declspec(dllimport) #endif // 导出jpegli解码初始化函数 extern "C" JPEGLI_WRAPPER_API struct jpegli_decompress_struct* JpegliCreateDecompress() { struct jpegli_decompress_struct* cinfo = new jpegli_decompress_struct(); jpegli_create_decompress(cinfo); return cinfo; } // 导出jpegli解码清理函数 extern "C" JPEGLI_WRAPPER_API void JpegliDestroyDecompress(struct jpegli_decompress_struct* cinfo) { jpegli_destroy_decompress(cinfo); delete cinfo; } // 按需添加其他jpegli API的导出,比如编码相关的jpegli_create_compress、jpegli_destroy_compress等
- 右键项目→属性→C/C++→预处理器→预处理器定义:添加
JPEGLI_WRAPPER_EXPORTS,确保导出宏生效
步骤3:编译生成DLL
- 确认项目平台(x86/x64)与
jpegli-static.lib的编译平台一致 - 编译项目,生成
jpegli-wrapper.dll,该DLL包含jpegli的完整新API
步骤4:C#中调用DLL(PInvoke示例)
using System.Runtime.InteropServices; public class JpegliWrapper { // 用IntPtr传递jpegli结构体(如需直接操作结构体,可对应定义C#结构体) [DllImport("jpegli-wrapper.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr JpegliCreateDecompress(); [DllImport("jpegli-wrapper.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void JpegliDestroyDecompress(IntPtr cinfo); // 按需添加其他PInvoke方法,对应导出的jpegli API }
注意事项
- 若编译出现头文件找不到的错误,检查附加包含目录的路径是否正确
- 若出现链接错误,确认
jpegli-static.lib的路径、平台与项目匹配 - 导出函数时严格匹配jpegli API的参数类型与返回值,避免类型不匹配导致崩溃
内容的提问来源于stack exchange,提问作者Miles
相关产品推荐
相关产品推荐

