C#中调用C++生成的dll出错,请教请教!? 400 报错
在C++中生成的dll,函数定义为int CebxInitial(string inFilename)
在WPF中调用(属于C#吧),编译链接没错,运行报错:
Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'E:\WPFtestCebxTools\WPFtestCebxTools\bin\Debug\WPFtestCebxTools.vshost.exe'.
Additional Information: A call to PInvoke function 'WPFtestCebxTools!WPFtestCebxTools.MainWindow::CebxInitial' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
是不是说类型不匹配啊?我试了试,除非传空参数不报错,传string、char*都报错,就是运行到
res = CebxInitial(namein);///////////////
这一行时报错。
是我的DllImport时参数设置不对还是其他的啊?
WPF中大致代码如下:
namespace WPFtestCebxTools { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { /////////////////////////// [DllImport("CebxtoPngDll.dll", EntryPoint = "CebxInitial", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern Int32 CebxInitial(String inFilename); public MainWindow() { InitializeComponent(); //StringBuilder namein = new StringBuilder("D:\\test.cebx"); string namein = "D:\\test.cebx"; //StringBuilder nameout = new StringBuilder("D:\\test.png"); String nameout = "D:\\test.png"; String exfcnameout = "no exfc"; Int32 res = 0; res = CebxInitial(namein);/////////////// } } }
楼上的我试了下,还是有问题,不过谢谢你的回答,我找身边的高手给看了看,已经解决了
在C++里定义函数时加个 __sdkcall,即:
int __stdcall CebxInitial(LPCTSTR inFilename);
然后自己在内部匹配一下类型就可以了,
LPCTSTR 应该也可以换成其他类型,但是关键问题还是VS2005里的C和VS2010里的wpf对于
public
static
extern
Int32 CebxInitial(
[MarshalAs(UnmanagedType.LPStr)]
String inFilename
);
感觉不对吧.不同语言间交互,这个最好用COM吧,方便而且通用.
######__cdecl,__stdcall 两者的堆栈清理者是不同的版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。