How to use DTE in PowerShell?

前端 未结 3 1054
一整个雨季
一整个雨季 2021-02-20 02:02

I am trying to use PowerShell to automate the process of creating an n-tier solution based on a seed (think EDMX file or DbContext) configuration. I want to be able to open a sk

相关标签:
3条回答
  • 2021-02-20 02:35

    Running Visual Studio 2019, I've been able to start the debugger with the 'VisualStudio.DTE' COM interface (without the version):

    #Get the ProcessID from an AppPool's worker process: 
    [int] $ProcessId = ([xml] (& "$env:SystemRoot\system32\inetsrv\appcmd.exe" list wp /xml /apppool.name:"DefaultAppPool")).appcmd.WP."WP.NAME"
    
    # Start the debugger, attached to that ProcessID
    [Runtime.InteropServices.Marshal]::GetActiveObject('VisualStudio.DTE').Debugger.LocalProcesses | 
           ? {$_.ProcessID -eq $ProcessId} | %{$_.Attach()}
    

    Previously it was necessary to specify the version.

    0 讨论(0)
  • 2021-02-20 02:41

    I found a simple answer by playing with the idea in ISE for a little while.

    Basically, the call to GetActiveObject returns a COM object, which can be used directly in PowerShell. After executing LoadDTELibs, you can get an instance of DTE by calling GetActiveObject and then refer to the result directly.

    So...

    PS> $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE.11.0")
    

    Then:

    PS> $dte.solution.Create("D:\Testing", "Acme.sln")
    PS> $dte.solution.SaveAs("D:\Testing\Acme.sln")
    

    I'm not 100% sure, because I don't know PowerShell or COM all that well, but I think you don't really have to worry about releasing the COM instance.

    0 讨论(0)
  • 2021-02-20 02:41

    For VS 2017 it is as follows:

    $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE.15.0")
    
    0 讨论(0)
提交回复
热议问题