为什么没有预建的 PInvoke DLL?

Why aren't there pre-built PInvoke DLLs?

我正在构建一个使用一些 user32.dll 函数和一些 gdi32.dll 函数的 PowerShell 脚本。过去我不得不这样做好几次。

我厌倦了在我的 PowerShell 代码中查看这些巨大的字符串中的 C# 代码块。我也厌倦了必须为我打算使用的每个单独函数找到 PInvoke 代码。我想要一个包含所有(已知)user32.dll 函数的单个 DLL,这样我就可以一劳永逸地使用它们。

我用谷歌搜索了一下,似乎无法在 user32.dll、win32.dll 或其他流行的非托管 dll 中找到所有已知函数的任何预构建 PInvoke 包装器 DLL。为什么是这样?我知道它们可能不稳定,需要不断更新 - 是这个原因吗?

我还注意到 http://pinvoke.net/ 提供了一个自动生成签名的 Visual Studio 插件...这是否意味着我可以使用 pinvoke.net 网络服务来自动生成签名基于他们数据库最新状态的 dll?

Internet 上没有预构建的 DLL 以及没有人使用 PInvoke.net 的 Web 服务来自动执行此操作的原因是,那里的大部分数据都适合人类理解并解释但不适合自动脚本使用。不过,如果清理干净的话,还是有可能的。

很多此类信息仍存储在 msdn 上,但创建此类包含所有已知功能的包装器 DLL 需要时间。 AFAIK,还没有人这样做过。我很乐意花时间浏览 user32.dll 中的 586 个已知函数并创建一个可供其他人使用的包装器 DLL,但我没有时间,因为大多数人都会这样做我想。我认为微软没有这样做只是因为他们觉得不值得花时间。

此外,似乎其中一些函数的构建方式可能甚至没有正确的方法来转换为托管代码并确保它们可以正常工作。特别是,解释哪些 C# 类型应该用于 C 指针似乎是一个问题。

可以轻松使用您提到的 P/Invoke 网络服务。我尝试了一下,发现 P/Invoke 数据库的格式根本无法用脚本导入。它 不是 以定义的方式构建,因此您要么必须想出某种 "intelligent parsing" 或自己修复错误,这将是太多的工作! kernel32.dll 已经生成了 4000 行代码,更不用说其他数百个库了。

这是我到目前为止所做的,结果在放入 C# 文件时不可编译。过滤掉 "TODO" 项目是一回事,但许多项目还包含语法错误,引用其他未明确定义的结构等等......问题很简单,数据库没有任何明确格式种类。这只是用户可以在其中键入文本的纯文本字段。

我在使用下面脚本的结果时遇到 127 个编译错误。我想这是最接近的了。

PInvokeServiceSoapClient client = new PInvokeServiceSoapClient();
client.Open();
foreach (FunctionInfo function in client.SearchFunction("kernel32.dll", new WikiVersion()))
{
    Console.WriteLine(function.Function);
    try
    {
        foreach (SignatureInfo signature in client.GetResultsForFunction(function.Function, function.Module))
        {
            if (signature.Language == "C#")
            {
                if (!signature.Signature.Contains("TODO"))
                {
                    if (!signature.Summary.StartsWith("TODO"))
                    {
                        Console.WriteLine("/// <summary>\r\n/// " + signature.Summary + "\r\n/// </summary>");
                    }
                    Console.WriteLine(signature.Signature.Replace("|", "\r\n"));
                }
            }
        }
    }
    catch { }
}
client.Close();

也许有一天您会想到如何创建一个包含所有 WinAPI 函数并充当所有内容的包装器的 DLL。会很酷的!