首页 > 编程语言 >C#调用C/C++动态库dll异常:对 PInvoke 函数调用导致堆栈不对称问题

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

时间:2023-07-28 17:44:06浏览次数:32  
标签:调用 C# 托管 C++ CallingConvention 函数调用 PInvoke 堆栈

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

标签:调用,C#,托管,C++,CallingConvention,函数调用,PInvoke,堆栈
From: https://www.cnblogs.com/wuguoqiang/p/17588535.html

相关文章

  • PowerPoint 2019 for Mac(PPT2019) v16.76 beta中文版
    PowerPoint2019mac是一款幻灯片制作软件,是 office 2019套件中的一部分。它可以帮助用户创建各种类型的演示文稿,包括商务演讲、学术报告、培训材料等等。与之前版本相比,提供了更多的功能和改进,例如更强大的演示文稿制作工具、更好的视觉效果和更加智能的助手。PowerPoint2019......
  • ChatGPT狂飙240天,欢迎来到AIGC时代!
    2023年的互联网,针对GPT的讨论已经蔚然成风,相关话题热度如火箭一般蹿升。生成式预训练模型(GenerativePre-trainedTransformer,简称GPT)是人工智能AI子领域自然语言处理中的一个重要技术,由OpenAI团队开发。GPT是一种基于互联网的、可用数据来训练的、文本生成的深度学习模型,并在不同......
  • C# 字符串转码后操作二进制文件
    String转码后写入二进制文件,读二进制文件进行解码返回。publicclassBinaryClass{///<summary>///写二进制文件///</summary>///<paramname="binFile"></param>///<paramname="str">&......
  • 【C++学习之路】引用(reference)
    变量名实质上是一段连续内存空间的别名,是一个标号,程序通过变量来申请并命名内存空间。引用的本质:就是给变量名取一个别名普通变量的引用inta=10;//定义的时候,&修饰变量为引用b就是a的别名(引用)//洗头膏不会为引用开辟空间int&b=a;//引用必须初始化系统数组的引用intarr[5]......
  • CSS隐藏滚动条
    一、纯CSS+div样式隐藏在需要滚动的元素外面再套一个div,给最外面的div设置样式overflow:hidden,宽度比需要滚动的元素小;之后给需要滚动的元素设置样式overflow-x:hidden;overflow-y:scroll;<styletype="text/css">*{margin:0;padding:0;}.box{width:100px;height:300px;......
  • 【软件测试】简易挡板测试——Mock服务搭建及使用方法
    1. Mock介绍1.1Mock简介Mock测试也被称为替代测试与挡板测试,Mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是Mock对象。Mock对象就是真实对象在调试期间的代替品。形如上图,服务B就可以用Mo......
  • windows下shellcode注入的例子(WriteProcessMemory+CreateRemoteThread)
    vs里x64编译如下代码:  #include<iostream>#include<Windows.h>//#include"common.h"intmain(){ //msfvenom-pwindows/x64/execCMD=notepad.exe-fc unsignedcharshellcode[]= "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x0......
  • cisp认证,让你在信息安全领域“风生水起”
    CISP认证CISP 即“注册信息安全专业人员”,系国家对信息安全人员资质的最高认可。英文为CertifiedInformationSecurityProfessional(简称CISP)。CISP是强制培训的。如果想参加 CISP考试,必须要求出具授权培训机构的培训合格证明,培训后直接由GLAB提供给国测中心。CISP认......
  • 最全springcloudAlibaba视频笔记-第三章Nacos Config服务配置中心
    NacosConfig服务配置中心课程视频:https://www.bilibili.com/video/BV1VW4y1o7n5本课程使用的是目前最新版本2022.0.0.0-RC2。基于SpringBoot3.0与JDK20的开发环境。集群中每一台主机的配置文件都是相同的,对配置文件的更新维护就成为了一个棘手的问题。此时就出现了配置中心......
  • Android NFC简介
    目录:AndroidNFC1 简介1.1 什么是 NFC1.2Android 上的 NFC1.3Android 中的 NFC 通讯机制2 用法2.1 读取 tag2.2 发送消息2.2.1 发送过程2.2.2NDEF 消息格式1 简介1.1 什么是 NFC近场通讯 (NearFiledCommunication) 技术是一种近距离的高频无线......