【问题标题】:How to obatin a different interface from a COM object in PowerShell如何从 PowerShell 中的 COM 对象获取不同的接口
【发布时间】:2020-12-09 13:25:19
【问题描述】:

使用像[System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE") 这样的COM 方法,我可以很好地导航Visual Studio DTE 对象模型。例如,从DTE 对象我可以得到Debugger,然后是LocalProcesses,然后是Process 对象。但我需要派生的Process2 接口,调用Attach2("<my debug engine>")。 我找不到获取我想要的接口的方法,一个简单的转换会导致运行时错误:Cannot convert the "System.__ComObject" value of type "System.__ComObject#{5c5a0070-f396-4e37-a82a-1b767e272df9}" to type "EnvDTE80.Process2"

PS> $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE")
PS> $p = $dte.Debugger.LocalProcesses | where {$_.ProcessID -eq 11212}
PS> $p


Name       : C:\Program Files\IIS Express\iisexpress.exe
ProcessID  : 11212
Programs   : System.__ComObject
DTE        : System.__ComObject
Parent     : System.__ComObject
Collection : System.__ComObject



PS> [EnvDTE80.Process2]$p2 = $p
Cannot convert the "System.__ComObject" value of type "System.__ComObject#{5c5a0070-f396-4e37-a82a-1b767e272df9}" to type "EnvDTE80.Process2".
At line:1 char:1
+ [EnvDTE80.Process2]$p2 = $p
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullyQualifiedErrorId : RuntimeException

【问题讨论】:

    标签: visual-studio powershell com envdte


    【解决方案1】:

    你真的不能,至少不能以 PowerShell 在成员绑定方面能够记住的方式。

    PowerShell 只根据运行时信息进行操作。即使您首先在 C# 中转换它,如果 QueryInterface 为该接口返回相同的指针,那么所有 PowerShell 将看到的是它当前检测到的 IDispatch。即使您获得的对象是来自主互操作程序集的强类型版本,PowerShell 也只能看到具体类型(Process2 似乎没有具体类型)。

    作为一种解决方法,您可以使用反射:

    [EnvDTE80.Process2].InvokeMember(
        'Attach2',
        [Reflection.BindingFlags]::InvokeMethod,
        <# binder: #> $null,
        <# target: #> $process,
        <# args: #> @($myEngine))
    

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2020-08-08
      • 2010-11-28
      相关资源
      最近更新 更多