在Windows 7 64位中使用[DllImport(“ iphlpapi.dll”)]

5 c# dllimport winforms

 [DllImport("iphlpapi.dll")]
 private static extern int GetTcpTable(IntPtr pTcpTable, ref int pdwSize, bool bOrder);
Run Code Online (Sandbox Code Playgroud)

我正在使用此dll并调用该函数为 GetTcpTable(IntPtr.Zero, ref iBytes, false)

它在Windows 7 32位操作系统上运行正常,但在64位OS中无法运行。我如何使其在Windows 7 64位操作系统上运行?

TyC*_*obb 2

看来问题出在您的签名上:

private static extern int GetTcpTable(IntPtr pTcpTable, ref int pdwSize, bool bOrder);
Run Code Online (Sandbox Code Playgroud)

查看文档,它显示以下内容:

public static extern int GetTcpTable(byte[] pTcpTable, out int pdwSize, bool bOrder);
Run Code Online (Sandbox Code Playgroud)

您正在使用 IntPtr,但它应该是一个将填充MIB_TCPTABLE结构的缓冲区。

我尝试查找引用实现所有这些的正确方法的文章,但没有找到很多。令我震惊的是,pinvoke.net 甚至没有列出 GetTcpTable 或我上面提到的结构。

编辑: 你可能想看看GetExtendedTcpTable()

我还发现Vista中引入了一个GetTcpTable2() 。它包含相同的签名,因此也许只是看看调用它是否会使其在 x64 上神奇地工作,因为您当前的调用应该在 x86 上工作。它可能无法 100% 开箱即用,但我很好奇它是否能让您走得更远,或者至少能带来不同的结果。