Ras*_*org 0 c# c++ api pinvoke
我目前遇到一个从C#windows应用程序调用Win32 DLL [Native]的问题.
我到目前为止.
C++源码:
extern "C" __declspec(dllexport) int PlaceSound(__in DWORD frequence, __in DWORD duration)
{
Beep(frequence, duration);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C#来源:
[DllImport("SampleLib.dll")]
public extern static int PlaceSound(int Freq, int Dura);
public form1 { InitializeComponements; PlaceSound(150, 500); }
Run Code Online (Sandbox Code Playgroud)
在调试时,我接收到声音,但是,当库返回其整数值时,我似乎得到了一个pinvoke.
Pinvoke:
调用PInvoke函数'SoundTracer!SoundTracer.Form1 :: PlaceSound'使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.
我究竟做错了什么?
Dav*_*nan 10
C++编译器cdecl
的默认调用约定是,但是p/invoke的默认调用约定是stdcall
.这种不匹配是您看到的消息的原因.
此外,要100%正确,DWORD
是无符号整数,应与之匹配uint
.
所以你需要像这样导入它:
[DllImport("SampleLib.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static int PlaceSound(uint Freq, uint Dura);
Run Code Online (Sandbox Code Playgroud)