`
tcspecial
  • 浏览: 906515 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

    博客分类:
  • C#
阅读更多

    VS10下调用dll,代码如下:

 

// C++接口声明
void test(char *str);

// 接口声明
[DllImport("datalib.dll", EntryPoint = "test")]
public static extern void test(string str);

// 调用 
string str="Hello";
test(str);

   运行出现异常:  调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

 

   出现这个错误,可能

   1.参数类型不匹配

     难道char*不能用string来表示,IntPtr是一定可以的.将C++类型更改成int类型后测试,发现仍然出错,这样看来,不可能是参数类型不匹配了

   2. 调用约定不匹配

    DllImport还有一个CallingConvention的属性,默认值是CallingCovention.Stdcall,  此处更改成Cdecl(c/c++默认调用方式)就可以了

[DllImport("datalib.dll", EntryPoint = "test",CallingConvention=CallingConvention.Cdecl)]
public static extern void test(string str);

 

   VS10下必须得指定这个属性才能运行, 同样的代码在VS08下却不存在这样的问题, 奇怪 ...

分享到:
评论

相关推荐

    使用Signature Tool自动生成PInvoke调用Windows API的C#函数声明

    PInvoke(Platform Invoke)是.NET框架提供的一种机制,允许托管代码(如C#)直接调用非托管代码(如C++或Windows API)。这一过程通常涉及到手动编写C#函数声明,以匹配API函数的原型。然而,Signature Tool简化了...

    PInvoke生成器

    PInvoke生成器是一个工具,它帮助开发者简化了这一过程,通过自动生成必要的函数声明,使得托管代码能够安全、高效地调用非托管库中的函数。 PInvoke是.NET框架提供的一种机制,允许.NET应用程序调用本机DLL中的...

    自动生成PInvoke调用Windows API的C#函数声明.rar

    在.NET框架中,C#程序员经常需要调用非托管代码,比如Windows API,来利用操作系统提供的功能。这个压缩包文件“自动生成PInvoke调用Windows API的C#函数声明.rar”提供了一个工具,帮助开发者自动创建必要的PInvoke...

    调用非托管DLL参数问题

    ### C#调用非托管DLL参数详解 #### 引言 在进行跨平台或跨语言编程时,常常需要从C#调用非托管代码(通常是C/C++编写的DLL)。这种场景下,如何正确地处理参数传递至关重要。本文将详细探讨在C#中调用非托管DLL时...

    迅雷云加速开放平台c#demo(修正版)

    这个错误通常由于托管的PInvoke调用(即.NET Framework与非托管C++代码之间的交互)中的签名不匹配所引起。 1. **迅雷云加速服务**:迅雷云加速是一项利用迅雷的技术优势,为开发者提供数据传输加速服务的平台。它...

    PInvoke Interop Assistant.rar

    P/Invoke是.NET框架提供的一种机制,允许托管代码(C#)调用非托管代码(通常为C或C++编写),如DLL中的函数。 描述 "C++接口转C#" 指出这个工具可能帮助开发者将C++编写的接口转换为C#可以使用的形式。在.NET环境...

    PInvoke 教程.pdf

    - **定义**: PInvoke(Platform Invoke)是一种允许.NET程序调用非托管代码(如Win32 API)的技术。它作为.NET框架的一个核心特性,为.NET开发者提供了与现有非托管代码交互的能力。 - **背景**: 随着.NET平台的出现...

    .netPInvoke逆向调用

    2. **方法签名匹配**:确保C#方法的参数类型和顺序与目标DLL中的函数相匹配。这包括数据类型、传入/传出参数、指针等。例如,`MessageBoxA`函数需要`IntPtr`类型的句柄,字符串参数和一个`uint`类型的常量。 3. **...

    PInvoke Interop Assistant

    P/Invoke是.NET框架的一个特性,它允许.NET应用程序调用非托管DLL中的函数,这些函数通常是操作系统API或其他C/C++库。通过定义特定的C#或VB.NET签名,开发者可以指定非托管函数的参数类型、返回类型以及调用约定。 ...

    PInvoke调用DLL.zip

    在.NET框架中,有时我们需要调用非托管代码,如C++编写的DLL,这时就需要用到平台调用(Platform Invoke,简称P/Invoke)。P/Invoke是.NET Framework提供的一种技术,使得.NET应用能够与非托管代码进行交互。本文将...

    RedGate pInvoke VS addin 1.10.0007

    - 错误检查:检查pInvoke签名的正确性,避免常见的错误,如数据类型不匹配、平台调用约定错误等。 - 文档提示:为每个调用的非托管函数提供相关文档链接或内部注释,方便开发者了解函数的用途和参数。 - 示例代码...

    VS PInvoke插件 RedGate.PInvokeExtension VS平台调用插件 PInvoke.NET 最新 最全

    PInvoke插件 RedGate.PInvokeExtension VS平台调用插件 PInvoke 平台调用 调用C++ 调用系统 C#调C++, Search Module: Directory Constants Delegates Enums Interfaces Structures Desktop ...

    PInvoke.net官方提供的VS API插件

    通过集成PInvoke.net的数据库,该插件使得开发者能够在编写代码时快速查询到正确的API签名和用法,避免手动搜索网站,从而提高开发速度和准确性。 标签“PInvoke”指的是.NET Framework中用于调用本机函数的功能,...

    在vs2008里使用pinvoke.net插件 .rar

    在Visual Studio 2008(VS2008)中使用PInvoke.NET插件是一个高效的方法,允许开发者调用Windows API和其他非托管代码库,从而扩展.NET Framework的功能。PInvoke(Platform Invoke)是.NET Framework提供的一种机制...

    delphi动态调用Dll

    PInvoke是一种机制,使得托管代码(如Delphi)可以调用非托管代码(如C语言编写的DLL)。DLL函数通常使用stdcall调用约定,其中函数参数由被调用者清理,这是DLL函数常见的约定。 5. **示例代码**: ```delphi uses...

    如何在 Visual Studio.NET 或 Visual Studio 2005年中的本机 Visual C++ 代码中调用托管的 DLL

    - 托管和非托管代码间的内存管理差异可能导致内存泄漏,确保正确地处理对象生命周期。 - 为了兼容性,尽量避免使用.NET Framework的高级功能,如泛型、委托等,因为它们可能无法在P/Invoke中直接映射。 - 需要...

    精通.NET互操作PInvoke,C++ Interop和COM Interop

    在`Source_Code`目录中,你可能会找到使用PInvoke调用非托管API的例子,例如Windows API。 2. **C++ Interop(也称为Managed C++或CLI C++)** C++ Interop是C++/CLI(Common Language Infrastructure)的一部分,...

    pinvoke_CSharpe

    在.NET框架中,C#作为高级编程语言,有时需要调用非托管代码,例如C++编写的DLL函数,这时就需要用到P/Invoke(Platform Invoke)技术。P/Invoke是.NET Framework提供的一种机制,允许托管代码(如C#)与非托管代码...

    pInvoke.rar

    - 性能:虽然P/Invoke允许.NET应用访问C++功能,但相比.NET代码,调用非托管函数可能会有性能损失。 - 平台兼容性:非托管代码可能不适用于所有.NET支持的操作系统,因此在跨平台应用中需要特别注意。 总结起来,...

Global site tag (gtag.js) - Google Analytics