WinPcap C#包装pcap_findalldevs()会抛出PinVokesTacks

WinPcap C#包装pcap_findalldevs()会抛出PinVokesTacks,c#,pinvoke,marshalling,wrapper,winpcap,C#,Pinvoke,Marshalling,Wrapper,Winpcap,我正试图为winpcap编写一个C#包装器。当我尝试调试时,它会发出警告pinvokestackdisbalancement,但pcap_findalldevs会完成它的工作。但我认为这会导致程序内存泄漏。顺便说一句,这段代码来自networkminer,我写这段代码不是为了理解winpcap和包装。 这是WinPcap中的方法 int pcap_findalldevs( pcap_if_t ** alldevsp, char * errbuf ) 这是我在程序中写的 [DllImport(

我正试图为winpcap编写一个C#包装器。当我尝试调试时,它会发出警告pinvokestackdisbalancement,但pcap_findalldevs会完成它的工作。但我认为这会导致程序内存泄漏。顺便说一句,这段代码来自networkminer,我写这段代码不是为了理解winpcap和包装。

这是WinPcap中的方法

int pcap_findalldevs( pcap_if_t **  alldevsp, char * errbuf )
这是我在程序中写的

[DllImport("wpcap.dll", CharSet = CharSet.Ansi)]
internal static extern int pcap_findalldevs(ref IntPtr alldevsp, StringBuilder errbuf);

i = IntPtr.Zero;
        StringBuilder stringBuilder;
        stringBuilder = new StringBuilder(256);

if (pcap_findalldevs(ref i, stringBuilder) == -1)
            return null; 

您缺少
cdecl
呼叫约定:

[DllImport("wpcap.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]

DllImport
的默认调用约定是
stdcall
,但我敢打赌WinPcap库被导出为
cdecl

太多了,但PinVokesTack的含义是什么?它仍然在做它的工作,stdcall和cdecl都从右向左将参数推送到堆栈上。他们在谁清理堆栈上有所不同。被调用方清理stdcall,调用方清理cdecl。后者是在C中启用可变函数的功能。您的PinVokeStack不平衡警告检测到调用方没有像应该的那样清理堆栈,并警告您。你可能会侥幸逃脱,因为在造成伤害之前,堆栈会重新对齐。但你不可能总能逃脱惩罚。您必须使您的通话约定相匹配。