12

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

但是,当我启动我的应用程序时,它总是因“找不到 PInvoke dll -- System.MissingMethodException”错误而失败(当调用本机代码时,DllImport 属性变得无用)。我知道本机 dll 与可执行文件位于同一文件夹中。我还应该做什么?

我正在使用 VS 2008。

4

4 回答 4

9

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

  1. 您缺少要调用的本机库的依赖项。
  2. 为错误的子系统(即桌面,而不是 CE)编译了本机程序集
  3. 本机程序集是为错误的处理器编译的(即 x86 而不是 ARM)
  4. 您没有足够的虚拟内存供 DLL 加载。

您是否验证过 DLL 入口点未使用dumpbin之类的东西进行修饰?

于 2009-09-22T03:27:11.317 回答
5

鉴于错误消息,通常存在以下两个问题之一

  1. 它找不到DLL。通过查看执行目录和PATH环境变量找到DLL
  2. 它无法在 DLL 中找到该函数。您是否检查过以确保 DLL 的声明和定义都是 extern "C" 并标记为__declspec(dllexport)

此外,完整性检查是为了确保 DLL 名称拼写正确且缺少 .dll 后缀。

于 2009-09-21T18:43:29.287 回答
0

您的问题是由于 WM5 内存管理是废话。DLL 从插槽顶部到底部加载,而应用程序从底部到顶部加载。如果您的应用程序和 DLL 之间没有足够的空间,您将收到“无法 pinvoke”错误。

WM5 分配 32 个 32Mb 的插槽供应用程序运行。

每次 WM5 为 dll 分配内存时,它至少使用 64Kb 块,因此如果您的 DLL 为 32K,它将占用 64k,如果您的 DLL 占用 68k,那么 WM5 将分配 2x64Kb — 128Kb。

当 WM5 加载所需的 DLL 时,它总是会在预先加载的应用程序的底部地址加载,即如果应用程序 1 加载了 2×30kb 的 DLL,第一个将在地址 0 到 64k 处加载,第二个从 64 到 128 ,那么您的应用程序将从 128kb(而不是 0)加载其 DLL,即使您的应用程序运行到单独的插槽中也是如此。

为了使事情正常进行,您必须提前加载您的应用程序或从 Windows 启动文件夹中删除不需要的应用程序。

于 2009-12-29T15:14:27.267 回答
-1

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

于 2009-09-29T05:08:27.800 回答