在 64 位操作系统下 .NET 托管 (Managed) 代码中调用 32 位的非托管 (Unmanaged) 的本机 (Native) DLL

  近期在做一个小程序,需要用 C# 调用 WinPcap 驱动实现网络嗅探。首先使用 DllImport 加载 Packet.dll (WinPcap 驱动) 文件,然后调用其中的方法。但是在运行时出现如下错误:

  起初以为是文件名写错了(因为对应的头文件叫 Packet32.h),于是在 C:\Windows 目录下搜索 Packet,发现在 SysWOW64 目录下找到了 Packet.dll,于是大悟——Packet.dll 是 32 位的,而 .NET 托管代码在 64 位操作系统下默认是以 64 位运行的。想到 VS 中有个 CPU 的选项,于是摸索出这一解决方案,先共享如下:

  1.右键单击解决方案名,选择“配置管理器”。

  2.在使用 DllImport 调用外部 DLL 的项目中,打开“平台”下拉列表,选择“<新建...>”。

  3.在“新建平台”中选择 x86 平台。

  4.在“从此处复制设置”中选择 Any CPU ,并取消选择“创建新的解决方案平台”,确定退出。

  5.对于其他直接或间接引用该项目的项目,用上述方法添加 x86 平台,否则会提示无法加载 x86 平台的项目 DLL,然后关闭退出。

  6.Ctrl-F5 运行,已经可以正确调用 Packet.dll 内的函数了。

  总结:使用默认的 Any CPU 将不限制 CPU 类型,导致在 64 位平台下会以 64 位执行。因此,对于使用 DllImport 导入 DLL 的程序,及时是在 32 位环境下编程,也应显示选择 x86 平台,除非确定不会在 64位 平台下使用,或者同时含有 32 位和 64 位的 DLL。

posted @ 2008-09-19 21:05  田嵩  阅读(2547)  评论(1编辑  收藏  举报