c# 调用 c++函数 问题

jxdong1013 2013-05-20 06:42:16
c++ 的DLL 文件中定义了一个 函数:
int RunService(char *msgType, char *version, char *in, size_t inLen, char *out, size_t *outLen);
参数说明:
msgType:输入参数
version:输入参数
in:输入参数
inLen:输入参数
out:是输出参数
outLen:是输出参数

我在 c# 如下定义:
[DllImport("XXX.dll")]
public static extern int RunService(string msgType, string version, string inp , UInt32 inLen, StringBuilder outp, out UInt32 outLen);
请问这样定义 可以吗?
我在测试这个函数时报如下错误:
对 PInvoke 函数“HISShell!HISShell.CallYBDll::RunService”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

求帮助!
...全文
106 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxdong1013 2013-05-22
  • 打赏
  • 举报
回复
问题已经解决, .net framework 4.0 需要 CallingConvention= CallingConvention.Cdecl 这个属性
xian_wwq 2013-05-21
  • 打赏
  • 举报
回复
再关注下这几点 1. DllImport 中的charset,有的DLL使用的Ansi,使用Unicode或者Auto就会报错 2. 传进去的Stringbuilder要初始化下, 例如:Stringbuilder mBuilder = new StringBuilder(100); 传出来的长度参数,可以改为 ref int length试试
jiaoshiyao 2013-05-21
  • 打赏
  • 举报
回复
不是一个东西 你可以写成com组件
橘色的喵 2013-05-21
  • 打赏
  • 举报
回复
不知道啊,mark
jxdong1013 2013-05-21
  • 打赏
  • 举报
回复
我使用了,还是不行,主要是 函数 参数这个定义有问题,一直报错。 对 PInvoke 函数“HISShell!HISShell.CallYBDll::RunService”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
遊戲王千金 2013-05-21
  • 打赏
  • 举报
回复
c#调用非托管的函数类,是参考传送门
jxdong1013 2013-05-21
  • 打赏
  • 举报
回复
求帮助!help

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧