如何解决.NET CF异常“找不到PInvoke DLL”?

6

这是给所有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文件未正确构建(可能是因为不同的平台)。 - kgiannakakis
请确保您有足够的虚拟内存空间,因为P/Invoke导入可能会因此失败。 - arul
这两个项目在同一个解决方案中,它们一起部署,无需手动上传。 - Ignas Limanauskas
在这种情况下,将一个项目的输出作为另一个项目的参考添加进去。即使它不能解决你的问题,这也是处理依赖关系的好方法。 - kgiannakakis
4个回答

4
我有同样的问题,但这次涉及的平台没有明显的差异。为什么一些本应是“正常”的东西被记录得如此不清楚、难以理解,最糟糕的是如此“靠不住”。 是否有任何工具可以让我进入我的 PPC 模拟器,并逐步检查 (a) dll 是否在 CLR 期望的位置 (我已经将它放在模拟器上的相同目录和 windows 目录中 - 我可以使用模拟器的文件浏览器看到它在那里),(b) CLR 是否可以加载它 (是否有足够的内存等),(c) CLR 然后可以找到哪些函数存在 (如果我可以克服愚蠢的“找不到 dll”错误,这将非常有用)。
我希望能迫使盖茨或任何“Windows Mobile”团队使用他们创建的垃圾。

2
也许这似乎是一个显而易见的要检查的事情,但你是否为正确的CPU架构编译本地DLL?我IRC记得,Windows Mobile运行在多个CPU架构上。

Windows Mobile仅支持ARM架构,自Pocket PC 2003以来就一直如此。 - ctacke
啊,好的。我不知道那个。谢谢你的纠正。 - Michael Trausch
1
对于那些来到这里的人,请参阅Ignas本人所给出的答案,以了解他为什么接受了这个答案。 - Charles Keepax

0

你列出的异常和问题中的PInvoke签名名称不同:分别是MyDll.dll和ThreadBenchLib.dll。这是打字错误还是问题所在?

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


这是打错字了,真正的名字是 MyDll.dll。 - Ignas Limanauskas

0

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

希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接