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  之后运行正常。

 

 

 

 

 

 posted on 2017-11-09 17:59  仰光  阅读(343)  评论(0编辑  收藏  举报