为什么没有预先构建的PInvoke DLL?

时间:2015-01-14 02:57:45

标签: powershell dll pinvoke unmanaged managed

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

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

我已经用Google搜索过,似乎无法为user32.dll,win32.dll或其他常用的非托管dll中的所有已知函数找到任何预建的PInvoke包装DLL。为什么是这样?我知道也许他们不稳定并且经常需要更新 - 这是什么原因?

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

2 个答案:

答案 0 :(得分:0)

互联网上没有预先构建的DLL的原因,以及为什么没有人使用PInvoke.net的Web服务来自动化这个,是因为大多数数据都可以让人理解和解释但不适合通过自动脚本消费。如果它被清理了一吨,那么它可能是可能的。

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

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

答案 1 :(得分:0)

可以轻松使用您提到的P / Invoke Web服务。我试了一下,发现P / Invoke数据库的形成方式并不完全可以用脚本导入。 以定义的方式构建,因此您可能需要提出某种“智能解析”或自行修复错误,这将是太多的工作! 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的创意,并充当所有内容的包装器。这会很酷!