记一次 c# 调用C++ 编译dll 的各种状况

c# 调用格式   

[DllImport("TalkBack\\TCPSocket.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern IntPtr SocketInitial(string hostAddr, int hostPort);

c++ 编译格式

.h文件

extern "C"
{

  _API RTSP_Pusher_Handler _APICALL RTSP_Pusher_Create();

}

.def 文件

LIBRARY "libPusher"

EXPORTS

RTSP_Pusher_Create @ 1

1 .def文件 模块定义文件 解决找不入口点问题

在extern “c”  中声明方法时加入 _stdcall  ,如果没有(.def)文件单独去定义输出方法的名称,输出的方法中将会夹杂一些其他字符,这时c# 去调用方法的时候  就会显示找不到入口点的错误。

2. 调用堆栈不对称的情况  参数相关

这种情况一般都是由于参数问题导致的 ,比如参数格式不对 或者是参数数量不对等。

3.dll编译时选择多字节字符

dll在编译时选择多字节字符集  c# 调用 string类型传值  c++  char*  接受可以正常将字符串传入dll

 但是  如果dll在编译时选择 unicode 字符集  c#调用string类型传值 c++char* 接受将无法接收到正常的字符串值 。如“abcdefg”,c++接收到的只有“a”,这时c# 传入可以选择用byte【】  将字符串转成数组 ,此种方式也可正确将字符串值传入。

4 结构体中数组传值  

结构体中某项为数组  整体传入c++ 时 ,极有可能c++端接收的结构体中的数组值不对,必须将结构体中的数据,作为单独的一项参数,传入c++中。


 

猜你喜欢

转载自blog.csdn.net/weixin_36117384/article/details/88864272