Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 为什么不';没有预建的PInvoke DLL吗?_Powershell_Dll_Pinvoke_Unmanaged_Managed - Fatal编程技术网

Powershell 为什么不';没有预建的PInvoke DLL吗?

Powershell 为什么不';没有预建的PInvoke DLL吗?,powershell,dll,pinvoke,unmanaged,managed,Powershell,Dll,Pinvoke,Unmanaged,Managed,我正在构建一个PowerShell脚本,它使用一些user32.dll函数和一些gdi32.dll函数。过去我已经做过好几次了 在我的PowerShell代码中,我已经厌倦了在字符串中查看这些巨大的C代码块。我也厌倦了为我打算使用的每个函数寻找PInvoke代码。我想有一个单独的DLL包装所有(已知)user32.DLL函数,这样我就可以一劳永逸地将它们提供给我 我在谷歌上搜索过,似乎无法在user32.dll、win32.dll或其他流行的非托管dll中找到所有已知函数的预构建PInvoke包

我正在构建一个PowerShell脚本,它使用一些user32.dll函数和一些gdi32.dll函数。过去我已经做过好几次了

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

我在谷歌上搜索过,似乎无法在user32.dll、win32.dll或其他流行的非托管dll中找到所有已知函数的预构建PInvoke包装dll。为什么会这样?我明白,也许它们不会稳定,需要不断更新——这是原因吗


我还注意到它提供了一个VisualStudio插件,可以自动生成签名。。。这是否意味着我可以使用pinvoke.net web服务根据其数据库的最新状态自动生成dll?

互联网上没有预构建dll的原因,以及为什么没有人使用pinvoke.net的web服务来自动生成dll,这里的大部分数据可以让人理解和解释,但不能让自动化脚本使用。如果它被清理了一吨,这可能是无论如何

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


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

可以很容易地使用您提到的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();
PInvokeServiceSoapClient客户端=新的PInvokeServiceSoapClient();
client.Open();
foreach(client.SearchFunction(“kernel32.dll”,new WikiVersion())中的FunctionInfo函数)
{
Console.WriteLine(function.function);
尝试
{
foreach(client.GetResultsForFunction(function.function,function.Module)中的SignatureInfo签名)
{
如果(signature.Language==“C#”)
{
如果(!signature.signature.Contains(“TODO”))
{
如果(!signature.Summary.StartsWith(“TODO”))
{
Console.WriteLine(“///\r\n//”+signature.Summary+“\r\n/”);
}
Console.WriteLine(signature.signature.Replace(“|”),“\r\n”);
}
}
}
}
捕获{}
}
client.Close();

也许有一天你会想出一个创造性的主意,如何创建一个包含所有WinAPI函数的DLL,并充当所有东西的包装器。那太酷了

听起来好像有什么事情可以解决?但是我知道我对Java不满意,所以我想出了我自己的工具…你可以自己写这个。什么阻止了你?基于pinvoke.net的自动生成是个坏主意,因为那里的内容质量很低。我刚刚找到了web服务:所以我想我会自己写并很快发布到这里<代码>函数PInvoke($module){…}有很多框架类实际上在幕后使用p/invoke!事实证明,这是非常困难的,因为pinvoke.net中的许多条目都是设计为由人来解释的。还有很多东西可能是指
char*
<代码>字符串,
StringBuilder
ref char
?这些事情使自动翻译变得复杂。