【问题标题】:How do I solve the .NET CF exception "Can't find PInvoke DLL"?如何解决 .NET CF 异常“找不到 PInvoke DLL”?
【发布时间】:2010-09-24 02:43:14
【问题描述】:

这是给所有 C# 大师的。我已经为此苦苦挣扎了一段时间,在网上尝试了各种建议,但无济于事。该操作正在 Windows Mobile 5.0 中进行。

我有一个名为 MyDll.dll 的 DLL。在 MyDll.h 我有:

extern "C" __declspec(dllexport) int MyDllFunction(int one, int two);

MyDll.cpp中MyDllFunction的定义是:

int MyDllFunction(int one, int two)
{
    return one + two;
}

C# 类包含以下声明:

[DllImport("MyDll.dll")]
extern public static int MyDllFunction(int one, int two);

在同一个类中,我通过以下方式调用 MyDllFunction:

int res = MyDllFunction(10, 10);

这就是该死的东西不断给我“找不到 PInvoke DLL 'MyDll.dll'”的地方。我已经验证我实际上可以对系统调用执行 PInvoke,例如“GetAsyncKeyState(1)”,声明为:

    [DllImport("coredll.dll")]
    protected static extern short GetAsyncKeyState(int vKey);

MyDll.dll 与可执行文件位于同一文件夹中,我也尝试将其放入 /Windows 文件夹中,但没有任何更改也没有成功。非常感谢任何建议或解决方案。

【问题讨论】:

  • 您是否在项目中添加了 dll 作为参考?如果这样做,则无需手动复制文件。如果问题仍然存在,则可能是由于没有正确构建 dll 文件(可能是不同的平台)。
  • 确保您有足够的可用虚拟内存,因为 P/Invoke 导入可能会失败。
  • 两个项目在同一个解决方案中,部署在一起,无需手动上传。
  • 在这种情况下,添加一个项目输出作为对另一个的引用。即使它不能解决您的问题,这也是处理依赖关系的好方法。

标签: c# .net windows-mobile pinvoke


【解决方案1】:

我也有同样的问题,但是这次涉及的平台没有明显区别。为什么它应该是“正常”的东西被记录得如此糟糕,如此困难,最糟糕的是如此“片状”。 是否有任何工具可以让我进入我的 PPC 模拟器,并逐步检查 (a) dll 是否在 CLR 期望的位置(我已将它放在同一个目录和模拟器上的 windows 目录中 - 我可以看到它在那里使用模拟器文件资源管理器),(b)CLR可以加载它(有足够的内存等),(c)CLR可以找到存在的功能(如果我能超越愚蠢的“可以” '找不到 dll' 错误)

我很想强迫盖茨或任何“windows mobile”团队使用他们创造的废话。

【讨论】:

    【解决方案2】:

    也许这似乎是一件显而易见的事情,但您是否正在为正确的 CPU 架构编译本机 DLL? IIRC,Windows Mobile 在多个 CPU 架构上运行。

    【讨论】:

    • 看准了,www.trausch.us!赞!解决方案的平台是“任何 CPU”,我正在部署到 WM5。但是,出于某种原因,VS2005 决定将 DLL 的平台设置为 WM6。实际上,就在我完成这个问题之后,我注意到了这一点。不想输掉所有的打字,所以还是发布了这个问题。
    • Windows Mobile 仅在 ARM 架构上运行,并且自 Pocket PC 2003 以来一直如此。
    • 啊,好吧。对此一无所知。谢谢指正。
    • 对于那些在这里找到方法的人,请参阅 Ignas 自己给出的答案,了解他为什么接受这个答案。
    【解决方案3】:

    您列出的异常和您在问题中输入的 pinvoke 签名具有不同的名称:分别为 MyDll.dll 和 ThreadBenchLib.dll。是错字还是问题?

    如果不是问题,请尝试在depends 中打开 DLL。由于未满足的依赖关系,DLL 加载可能会失败。

    【讨论】:

    • 打错字了,真名是MyDll.dll
    【解决方案4】:

    我也有同样的问题。我使用 Depends.exe 来查找 WinCE dll 依赖项,它取决于调试 dll。 (MSVCR90D.dll) 为了解决这个问题,我编译了一个发布版本,并确认了依赖关系,之后它就可以正常工作了。

    希望能帮到你

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 2013-07-08
      • 2018-07-22
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多