1.添加 C++ dll 库项目,增加代码:
extern "C" __declspec(dllexport) int __cdecl SendMes(char * cmd, char * arg, char* mes , int mes_size) { sprintf_s(mes , mes_size , "cmd:%s arg:%s " , cmd , arg) ; return 99 ; }
2. C# 调用代码:
[DllImport("TestInkjetPrinterLibrary.dll", EntryPoint="SendMes" , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern int SendMes(byte[] cmd, byte[] arg ,[Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder mes , int mes_size );
3. 调用示例:
byte[] cmd = Encoding.Default.GetBytes(txt_cmd.Text); byte[] arg = Encoding.Default.GetBytes(txt_arg.Text); int mesLength = 500; StringBuilder strBuiMes = new StringBuilder(mesLength); int result = Library.SendMes(cmd, arg, strBuiMes, mesLength); MessageBox.Show(string.Format("返回值:{0} , {1}", result, strBuiMes.ToString()));
要点:
1.c# 调用需在 x86 环境 , 或着目标平台 Any CPU情况 勾选 首选32位
2. 调试时,勾选 项目 -> 属性 -> 调试 -> 启用本机代码调试.
3.中文参数时, 传入前,使用 系统默认代码页(Encoding.Default) , DLLIMPORT 设置: CharSet = CharSet.Ansi , C++ 项目字符使用Unicode 字符集(默认) , 全部 字符编码保持一致 。
4.使用不同版本开发环境编绎 C++ ,需要安装相应运行时环境, 如 VC 2005 C++ 需安装 Microsoft Visual C++ 2005 Redistributable Package (x86) ; 同时,发布包需要是 release 模式编绎 。
错误排查:
用VS2005 C++ 编译程序后 , 在客户机上运行异常:
应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。
使用release 模式编译仍无效情况,将【运行时库】 由 (多线程)/MD 改为 (多线程)/MT 之后运行正常。