Получение DTE для запуска экземпляров Visual Studio из PowerShell - PullRequest
1 голос
/ 08 апреля 2020

Получить DTE для одного работающего Visual Studio с PowerShell легко: Получить дескриптор работающего экземпляра Visual Studio (DTE) из powershell

Получение DTE для нескольких экземпляров с C# решено Как получить DTE для запуска экземпляра Visual Studio?

Теперь, как мне получить DTE для нескольких экземпляров VS с PowerShell? Я пытаюсь включить сценарии для настройки конфигурации VS и начать сборку после git pull, настройки VM + XDE et c, и все это без необходимости открывать новое окно VS, если оно уже открыто.

Вот что я получил:

$memberDefinitionGetRunningObjectTable = @'
[DllImport(@"ole32.dll",EntryPoint="GetRunningObjectTable",ExactSpelling=false)] 
public static extern int GetRunningObjectTable(
    int reserved,
    out IRunningObjectTable prot);
'@
$typeGetRunningObjectTable = Add-Type -MemberDefinition $memberDefinitionGetRunningObjectTable -Name "InteropGetRunningObjectTable" -PassThru -Using 'System.Runtime.InteropServices.ComTypes'

[System.Runtime.InteropServices.ComTypes.IRunningObjectTable]$runningObjects = $null
$ret = $typeGetRunningObjectTable::GetRunningObjectTable(0, [ref][System.Runtime.InteropServices.ComTypes.IRunningObjectTable] $runningObjects)
if ($ret -eq 0)
{
    if ($null -eq $runningObjects) { Write-Error "Failed to retrieve running COM objects"}
}

- это не удалось, поэтому кажется, что принудительное использование типа IRunningObjectTable для параметра out не работает и $runningObjects равно $null

Я пробовал это раньше:

$memberDefinitionGetRunningObjectTable = @'
[DllImport(@"ole32.dll",EntryPoint="GetRunningObjectTable",ExactSpelling=false)] 
public static extern int GetRunningObjectTable(
    int reserved,
    out IRunningObjectTable prot);
'@
$typeGetRunningObjectTable = Add-Type -MemberDefinition $memberDefinitionGetRunningObjectTable -Name "InteropGetRunningObjectTable" -PassThru -Using 'System.Runtime.InteropServices.ComTypes'

$memberDefinitionCreateBindCtx = @'
[DllImport("ole32.dll")]
public static extern int CreateBindCtx(
    int reserved,
    out IBindCtx ppbc); 
'@
$typeCreateBindCtx = Add-Type -MemberDefinition $memberDefinitionCreateBindCtx -Name "InteropCreateBindCtx" -PassThru -Using 'System.Runtime.InteropServices.ComTypes'

$runningObjects = $null
$ret = $typeGetRunningObjectTable::GetRunningObjectTable(0, [ref] $runningObjects)
if ($ret -eq 0)
{
    if ($null -eq $runningObjects) { throw "Failed to retrieve running COM objects"}

    $enumMoniker = $null
    $runningObjects.EnumRunning([ref] $enumMoniker)

    $typeCreateBindCtx::CreateBindCtx([ref] $enumMoniker)
}

Это приводит к этой ошибке, хотя:

Method invocation failed because [System.__ComObject] does not contain a method named 'EnumRunning'.
At line:6 char:5
+     $runningObjects.EnumRunning([ref] $enumMoniker)

Я просто немного озадачен здесь. Это __ComObject на самом деле $null и здесь?

1 Ответ

1 голос
/ 11 апреля 2020

Вы дали мне другой ответ, несколько связанный с этим. Все, что я могу предложить, это посмотреть, как я это делал около десяти лет go здесь:

https://github.com/Pscx/Pscx/blob/master/Src/Pscx.Core/Interop/RunningObjectTable/RunningObjectTableHelper.cs

Этот код изначально был на CodePlex.

Итак, если вы запустите "install-module psx", у вас уже есть бесплатный Get-RunningObjectTable, написанный уже.

...