在Windows Mobile中找不到PInvoke DLL错误

时间:2009-09-21 18:38:43

标签: .net windows-mobile compact-framework pinvoke emulation

我在使用基于Windows Mobile 5.0模拟器的基本方案时遇到了很多麻烦。我有一个winforms应用程序,最终调用本机代码。部署工作正常,所有本机DLL都复制到winforms .exe相同的文件夹中。我还验证了远程文件查看器工具的情况。

然而,当我启动我的应用程序时,它始终失败并显示“无法找到PInvoke dll - System.MissingMethodException”错误(当调用本机代码时,DllImport属性将变为无用)。我知道本机dll与可执行文件位于同一文件夹中。我还应该做些什么?

我正在使用VS 2008。

4 个答案:

答案 0 :(得分:8)

为了扩展Jared的答案,在P / Invoking CF中获得MissingMethodException的四个更常见的原因是:

  1. 您缺少正在调用的本机库的依赖项
  2. 本地人被编译为错误的子系统(即桌面,而不是CE)
  3. 为错误的处理器(即x86而非ARM)编译本机程序集
  4. 您没有足够的虚拟内存来加载DLL。
  5. 您是否验证过DLL入口点未修饰dumpbin

答案 1 :(得分:5)

鉴于错误消息,通常有两个问题之一

  1. 找不到DLL。通过查看执行目录和PATH环境变量
  2. 找到DLL
  3. 找不到DLL中的函数。您是否检查过以确保DLL的声明和定义都是extern“C”并标记为__declspec(dllexport)
  4. 此外,完整性检查是为了确保DLL名称拼写正确并且缺少.dll后缀。

答案 2 :(得分:0)

你的问题是因为WM5内存管理是垃圾。 DLL从顶部到底部加载,而应用程序从下到上加载。如果您的应用和DLL之间没有足够的空间,您将收到“无法解锁”错误。

WM5为应用程序分配32个32Mb的插槽。

每次WM5为dll分配内存时,它使用最小64Kb块,所以如果你的DLL是32K,它将需要64k,如果你的DLL需要68k,那么WM5将分配2x64Kb - 128Kb。

当WM5加载所需的DLL时,它将始终加载到预先加载的app的底部地址,即如果app 1加载了2×30kb的DLL,则第一个将加载到地址0到64k,第二个来自64到128,那么你的应用程序将从128kb加载其DLL,而不是0,即使你的应用程序运行到一个单独的插槽。

为了使工作正常,您必须提前加载应用程序或从Windows starup文件夹中删除不需要的应用程序。

答案 3 :(得分:-1)

您正在使用的DLL没有您所调用的方法的定义。 所以异常发生.. 它编译好..只在运行时出现问题.. 解决方案是你需要确保DLL中是否存在定义,否则你需要去寻找其他的dll。