从c#访问c++ dll库[重复]

Posted

技术标签:

【中文标题】从c#访问c++ dll库[重复]【英文标题】:Accessing c++ dll library from c# [duplicate] 【发布时间】:2013-01-07 10:16:42 【问题描述】:

可能重复:pinvokestackimbalance — how can I fix this or turn it off?

我需要从 c# 代码访问一个 c++ dll 库(我没有源代码)。

例如以下函数:

UINT32 myfunc1()
UINT32 myfunc2(IN char * var1)
UINT32 myfunc3(IN char * var1, OUT UINT32 * var2)

对于 myfunc1,我使用以下代码时没有问题:

[DllImport("mydll.dll")]
public static extern int myfunc1();

另一方面,我无法使用 myfunc2 和 myfunc3。 对于 myfunc2 我尝试了以下方法:(以及许多其他人拼命)

[DllImport("mydll.dll")]
public static extern int myfunc2(string var1);

[DllImport("mydll.dll")]
public static extern int myfunc2([MarshalAs(UnmanagedType.LPStr)] string var1);

[DllImport("mydll.dll")]
public static extern int myfunc2(char[] var1);

但是他们都给出了以下错误: "Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\Users\....\myproject\bin\Debug\myproj.vshost.exe'.

附加信息:对 PInvoke 函数 'myproject!myproject.mydll::myfunc2' 的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。"

请指导我应该怎么做。

【问题讨论】:

您是否尝试在项目设置中禁用vshost? 看看pinvokestackimbalance — how can I fix this or turn it off? 我认为这篇文章会对你有所帮助,***.com/questions/14152192/… 我认为这篇文章会对你有所帮助,coolthingoftheday.blogspot.in/2008/03/… 【参考方案1】:

您的 C++ 函数使用cdecl 调用约定,但DllImport 的默认调用约定是stdcall。这种调用约定不匹配是导致堆栈不平衡 MDA 错误的最常见原因。

您可以通过使调用约定匹配来解决问题。最简单的方法是更改​​ C# 代码以指定 cdecl,如下所示:

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int myfunc2(string var1);

【讨论】:

【参考方案2】:

可能只是字符集不匹配,试试这个

[DllImport("mydll.dll", CharSet = CharSet.Ansi)]
public static extern int SendText([MarshalAs(UnmanagedType.LPStr)] string var1);

昵称来自:

DLL import char * pointer from C#

【讨论】:

默认的CharSetAnsi

以上是关于从c#访问c++ dll库[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 程序访问 C++ DLL 中的多个函数

使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException

从 C++ 调用 C DLL 会导致访问冲突,但 C# 项目与 DllImport 工作

C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]

如何使用 C++ 静态库编译 C# 应用程序?

从 c# 调用 c++ 库