如何在 powershell 中添加和使用 c# 结构

Posted

技术标签:

【中文标题】如何在 powershell 中添加和使用 c# 结构【英文标题】:How to add and use a c# struct in powershell 【发布时间】:2021-11-10 12:47:53 【问题描述】:

我正在尝试将 POINT 结构添加到 powershell 以在 winapi GetCursorPos 函数中使用。这是我尝试过的:

$MethodDefinition=@'
[StructLayout(LayoutKind.Sequential)]
    public struct POINT
    
        public int X;
        public int Y;

        public POINT(int x, int y)
        
            this.X = x;
            this.Y = y;
        
    
[DllImport("user32.dll")]public static extern Int32 GetCursorPos(out POINT lpPoint);
'@;Add-Type -MemberDefinition $MethodDefinition -Name 'Win32' -NameSpace '' -PassThru

当我删除 GetCursorPos 定义时,它给我一个黄色:警告:生成的类型未定义公共方法或属性。 我不知道如何在 powershell 中使用结构,我只找到有关如何创建结构的信息。 见:https://www.pinvoke.net/default.aspx/Structures/POINT.htmlHow do I create a custom type in PowerShell for my scripts to use?https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.layoutkind?view=net-5.0

编辑: 我添加了一个结构,但仍然不知道如何构造它:

$StructDefinition=@'
public struct POINTpublic int X;public int Y;public POINT(int x, int y)this.X=x;this.Y=y;
'@;Add-Type -TypeDefinition $StructDefinition -PassThru

【问题讨论】:

【参考方案1】:

我解决了问题,会员定义:

$MethodDefinition = @'
[StructLayout(LayoutKind.Sequential)]
public struct POINT

  public Int32 x;
  public Int32 y;

  public POINT(Int32 X, Int32 Y)
  
    this.x = X;
    this.y = Y;
  


[DllImport("user32.dll")]
public static extern Int32 GetCursorPos(out POINT lpPoint);
'@

$WinApiVariable = Add-Type -MemberDefinition $MethodDefinition -Name 'Win32' -NameSpace '' -PassThru

显示光标位置:

$cursorPos = New-Object -TypeName 'Win32+POINT' -ArgumentList 0,0
[Win32]::GetCursorPos([ref]$cursorPos)
Write-Host "$($cursorPos.x),$($cursorPos.y)"

使用这种奇怪的 + 符号语法 Win32+POINT,我可以访问成员定义中的结构定义,New-Object 创建一个结构,[ref] 是引用一个结构。

【讨论】:

以上是关于如何在 powershell 中添加和使用 c# 结构的主要内容,如果未能解决你的问题,请参考以下文章

将外部 C# 脚本作为源添加到 PowerShell 脚本

通过 C# 代码执行 Powershell 命令

如何从 C# 程序运行 PowerShell 脚本?

如何在 C# 中向 powershellinstance 添加参数

如何使用 PowerShell 或 C# 将网页保存到 HTML 文件中?

如何在 PowerShell 或 C# 中获取进程的命令行信息