惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
B
Blog
T
Threat Research - Cisco Blogs
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
T
Tor Project blog
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Recorded Future
Recorded Future
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
B
Blog RSS Feed
Scott Helme
Scott Helme
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
AWS News Blog
AWS News Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
W
WeLiveSecurity

博客园 - wu.g.q

旧电脑适合的系统 安川机器人遇见的问题汇总 Estun机器人数据断电保持问题解决方案 安川机器人快捷键 安川机器人变量代替常量的转换关系 创建自己的代码仓库 vc6.0 txt文件资源转为xaml资源 查看Windows操作系统编码方式 wpf 元素设置焦点无效的问题 汽车知识总结 wpf - 设置滚动条拇指(Thumb)大小 C# 反序列化乱码 C# 确定文件编码格式的方法 C# 反序列化报错 XML 文档(1, 2)中有错误:不应有 <xml xmlns=''> xsd.exe语法示例 C# 获取XML文件内容的多种方式 VC6.0 dll debug C#与C++动态链接库DLL参数互传 C#动态调用C/C++的DLL
C#调用C/C++动态库dll异常:对 PInvoke 函数调用导致堆栈不对称问题
wu.g.q · 2023-07-28 · via 博客园 - wu.g.q

C#调用C/C++动态库dll异常:对 PInvoke 函数调用导致堆栈不对称问题

雨渡石桥

已于 2023-02-21 12:04:29 修改

973
收藏 1
文章标签: windows c++ c#
版权
结论:如果你是用C#调用C的动态库,如果出现“对 PInvoke 函数调用导致堆栈不对称问题”,建议优先调整CallingConvention的值,建议改为CallingConvention = CallingConvention.Winapi。此时C#会根据代码运行平台,自动选择正确的值。

环境:C#调用C生成的dll

代码:

问题描述:托管调试助手 "PInvokeStackImbalance":“对 PInvoke 函数“SuprDog!SuprDog.sntllicgen::Initialize”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。”

网上相关方法:

托管调试助手 "PInvokeStackImbalance":的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管 - wjw1990 - 博客园 (cnblogs.com)

但是以上方法并不能解决我的问题,遂尝试更改CallingConvention的值,改为CallingConvention = CallingConvention.Winapi后成功运行。以下是官方对CallingConvention的解释:

以下是通俗的理解(摘自CallingConvention理解 - 晨~光 - 博客园 (cnblogs.com)):

Cdecl:由调用者清理栈资源。非常适合用在可变参数的函数调用上,例如printf.

FastCall: Calling convention不支持。

StdCall:由被调用者清理栈资源。这是调用native函数时默认的方式。

ThisCall:第一个参数是this指针,会被存储在ECX寄存器里,而其它的参数会被压栈。这种方式通常用在调用未托管的DLL的方法或类。

Winapi:实际上并不是一个calling convention,实际上会被默认的平台的calling convention替代。例如window上调用,会替换成StdCall,Windows CE.NET上则被替换成Cdecl.

原文链接:https://blog.csdn.net/u010019329/article/details/129139627