我想在Kubuntu Linux上访问一些user32函数的Wine实现。我安装了Wine 1.1.31软件包。当尝试在MonoDevelop中运行这个简单的测试程序时,我得到一个System.EntryPointNotFoundException
。P/Invoke和单声道:EntryPointNotFoundException
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace PinvokeTesting
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(GetKeyState((int)Keys.A));
}
[DllImport("user32")]
private static extern short GetKeyState(int vKey);
}
}
这是输出:
未处理的异常: System.EntryPointNotFoundException:在 函数GetKeyState (INT): 函数GetKeyState在(包装纸 管理到本机) PinvokeTesting.MainClass PinvokeTesting.MainClass.Main (System.String [] args)[0x00000] in .../Main.cs:11
函数应该在那里,但它没有找到它。有任何想法吗?我做了很多搜索,没有发现任何有用的东西。文档似乎对这些问题相当稀少(无论是或我正在寻找错误的东西)。
编辑:我并不想使用的P/Invoke与的WinForms组合,也有葡萄酒其他一些功能,我需要的P/Invoke来。我只是想让Mono P/Invoke to Wine工作。
感谢您的解释。我试图调用'GetKeyState'的唯一原因是因为我试图从Wine中实际得到P/Invoked中的任何*函数,而不是因为我真的想要使用它。有趣的是,显然Mono能够加载'libuser32.so',但无法加载该函数。 IIRC,大约两年前,我能够得到P/Invoke到Wine库的工作。 (或许现在的问题与我现在的设置有关?)无论如何,我想我会寻找一条替代Wine的路线。 (此外,Wine不会成为我的程序的依赖项)。 – 2010-02-27 18:08:54
Mono能够重定向P/Invoke调用,并且特别是它会自动将user32.dll调用重定向到辅助共享库,该辅助共享库现在只包含少数工作函数。这就是为什么DLL似乎被加载,但没有找到符号。 对于某些情况下,您可能可以从wine dll中加载符号,只是使用它可能不起作用,或者可能会导致运行时崩溃或使其他事情无法正常工作。它不被支持,可能永远不会,所以不要认为任何不是深夜实验的程序都可以遵循这条路径。 – lupus 2010-02-28 08:26:05