C# 调用 C++ dll出错

本文探讨了C#调用C++ DLL时可能出现的调用约定问题,导致程序运行时崩溃。主要原因是不同的语言对调用约定的支持不一致,如C++的__stdcall和C#的StdCall。解释了_cdecl、__stdcall、__fastcall和thiscall等调用约定的工作原理,并指出在C++中使用__stdcall关键字的必要性。同时,展示了C#中如何正确声明和使用__stdcall调用约定的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于各自使用的调用规则不同,导致DLL回调或C#调用返回时系统直接calldown,可能原因如下:

并不是所有的语言都支持_cdcel调用规则,但是都支持_sdtcall调用规则, 假如你用VC做了一个DLL,导出了某些函数,如果你想这个DLL被其他语言也能调用的话,VB.DEPHI.PB..你的把他的调用约定声明为__stdcallwindows   api都是_stdcall调用规则,函数调用约定确定一个程序如何实现一个函数调用及参数如何传递。在单一语言程序中,调用约定几乎总是正确的,这是因为对所有模块总有一个缺省的约定并且头文件会负责调用和被调用程序之间的一致性。在一个混合语言程序中,不同的语言不可能分享同一个头文件。由于调用约定而产生的错误在编译时无法发现,直到程序在运行时(run-time)实现函数调用时才出现并会立即导致应用程序崩溃。

关键字                                                       栈的维护者          参数传递
__cdecl                                                     调用者 参数反序入栈(右-> 左)
__stdcall                                                    被调用者 参数反序入栈(右-> 左)
__fastcall                                                   被调用者 参数先存寄存器,接着入栈
thiscall(并非关键字)       被调用者 参数入栈,this指针存ECX

在C++中,可以在函数声明或定义时用关键字__stdcall指定调用约定。__stdcall调用约定经常在Windows程序或API函数中使用。在GUI程序中,PASCAL、WINAPI和CALLBACK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值