Получить 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
и здесь?