记一次 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# 去调用方法的时候  就会显示找不到入口点的错误。

无。def文件时写法

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

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

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

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

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

4 结构体中数组传值  

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

5.尝试读取受保护的内存

其中情况很大程度时是c++编写错误,如果c++编写没有问题,那么有可能就是传值时的错误。例如c++将一个int型的当作了指针,此时指向的很有可能是系统内存,因此出错。

 

 

 


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值