.net Can';在Windows Mobile中找不到PInvoke DLL错误

.net Can';在Windows Mobile中找不到PInvoke DLL错误,.net,windows-mobile,compact-framework,pinvoke,emulation,.net,Windows Mobile,Compact Framework,Pinvoke,Emulation,在windows mobile 5.0 emulator上运行基本场景时,我遇到了很多困难。我有一个winforms应用程序,它最终会调用本机代码。部署工作正常,所有本机DLL都复制到与winforms.exe相同的文件夹中。我还用远程文件查看器工具验证了这一点 但是,当我启动我的应用程序时,它总是会失败,并出现“找不到PInvoke dll--System.MissingMethodException”错误(当调用本机代码时,DllImport属性将变得无用)。我知道本机dll与可执行文件位于

在windows mobile 5.0 emulator上运行基本场景时,我遇到了很多困难。我有一个winforms应用程序,它最终会调用本机代码。部署工作正常,所有本机DLL都复制到与winforms.exe相同的文件夹中。我还用远程文件查看器工具验证了这一点

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


我使用的是VS 2008。

如果出现错误消息,通常会出现以下两个问题之一

  • 它找不到DLL。通过查看正在执行的目录和PATH环境变量可以找到DLL
  • 在DLL中找不到该函数。您是否已检查以确保DLL的声明和定义均为外部“C”并标记为
    \uu declspec(dllexport)

  • 此外,健全性检查是为了确保DLL名称拼写正确,并且没有.DLL后缀

    为了扩展Jared的回答,在CF中调用p/时,还有四个常见的原因导致MissingMethodException:

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

  • 您是否已验证DLL入口点是否未被修饰为?

    您正在使用的DLL没有您正在调用的方法的定义。 因此,出现了异常。。 它编译得很好。。只有在运行时才会出现问题。。
    解决方案是您需要确保定义是否存在于DLL中,否则您需要使用其他DLL。

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

    WM5为要运行的应用程序分配32个32Mb的插槽

    每次WM5为dll分配内存时,它都会使用最小64Kb的块,因此,如果dll为32K,则需要64k;如果dll为68k,则WM5将分配2x64Kb-128Kb

    当WM5加载所需的DLL时,它将始终加载在先前加载的应用程序的底部地址,即,如果应用程序1加载了2×30kb DLL,则第一个DLL将加载在地址0到64k,第二个DLL将加载在地址64到128,然后您的应用程序将从128kb而不是0加载其DLL,即使您的应用程序运行在单独的插槽中


    为了使事情顺利进行,您必须提前加载应用程序或从windows starup文件夹中删除不需要的应用程序。

    2快速评论:1)我第一次在exe文件夹中没有任何本机DLL。所以这个例外至少在当时是有意义的。既然已经确保所有的东西都部署好了,我怎么能再次遇到同样的异常呢?2) 我试图按照本文所述设置日志记录:我曾经使用远程注册表编辑器进行设置,但没有效果。根本没有创建任何日志文件!这么多基本的事情怎么会出错呢?嗨,贾里德,谢谢你的回复。1) 我非常确定本机dll与正在执行的应用程序位于同一目录中。事实上,有两个本机DLL。我对其中一个调用进行了注释,现在另一个调用抛出了相同的异常2)检查——我也为Win32平台编译了相同的代码库,它在那里工作得很好dll名称拼写正确,并且有.dll后缀(这不是你的意思吗?)你知道我为什么不能正确设置它吗:我使用远程注册表编辑器输入了所有的reqd键,但日志文件仍然没有创建。今天一定是万事如意的日子!仅供参考,无论是否使用“dll”后缀,它都可以正常工作,不过您应该在传入的确切字符串中保持一致(我使用const):到目前为止,所有建议都是我过去用来解决这些问题的建议。不过我有两件事要尝试。1.要启用.NETCF日志记录,请尝试在最后一个键和键值下设置DWORD值。我忘记了哪种组合对我有效,但我回忆起它让我感到困惑,仍然如此-例如[HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging]“Enabled”=1。2.尝试使用本机DLL的发行版编译版本。我们有一些DLL拒绝P/调用它们的调试构建。从未解决此问题,可能是一个build switch.method未公开用于导出目的true,但不是true。对于本机DLL为True,但对于此问题不为True。此问题被标记为“compact framework”,并且托管DLL不在此内存模型下加载。它们作为内存映射文件加载,不占用64k虚拟内存块。MSDN在Compact Framework如何使用您可能感兴趣的内存方面提供了非常好的网络广播。此外,如果您希望本机DLL与调用的exe位于同一目录中,请确保exe实际部署在同一目录中。