2013-07-21 17 views
6

Sto tentando di utilizzare powershell all'interno della console di Gestione pacchetti per scrivere la rimozione di un progetto da una soluzione e sto avendo un tempo sorprendentemente difficile.Rimuovere il progetto dalla soluzione tramite la console di Package Manager

posso facilmente aggiungere un progetto di

PM> $dte.Solution.AddFromFile("C:\Dev\Project1.csproj")

Ora voglio essere rimuovere un progetto e non può ottenere nulla al lavoro.

Ho provato un certo numero di cose tra cui:

PM> $project1 = Get-Project "Project1Name" 
PM> $dte.Solution.Remove($project1)> 

Cannot convert argument "0", with value: "System.__ComObject", for "Remove" to 
type "EnvDTE.Project": "Cannot convert the "System.__ComObject" value of type 
"System.__ComObject#{866311e6-c887-4143-9833-645f5b93f6f1}" to type 
"EnvDTE.Project"."
PM> $project = Get-Interface $project1 ([EnvDTE.Project]) 
PM> $dte.Solution.Remove($project) 

Cannot convert argument "0", with value: "System.__ComObject", for "Remove" to 
type "EnvDTE.Project": "Cannot convert the "System.__ComObject" value of type 
"NuGetConsole.Host.PowerShell.Implementation.PSTypeWrapper" to type 
"EnvDTE.Project"."
PM> $project = [EnvDTE.Project] ($project1) 

Cannot convert the "System.__ComObject" value of type 
"System.__ComObject#{866311e6-c887-4143-9833-645f5b93f6f1}" to type 
"EnvDTE.Project".
PM> $solution2 = Get-Interface $dte.Solution ([EnvDTE80.Solution2]) 
PM> $solution2.Remove($project1) 

Exception calling "Remove" with "1" argument(s): "Exception calling 
"InvokeMethod" with "3" argument(s): "Object must implement IConvertible.""
PM> $dte2 = Get-Interface $dte ([EnvDTE80.DTE2]) 
PM> $dte2.Solution.Remove($project) 

Method invocation failed because [System.Object[]] doesn't contain a method 
named 'Remove'.

ho provato altre combinazioni, ma sono chiaramente girare le ruote. Apprezzo qualsiasi suggerimento.

+0

Hai funzionato? Ho un bisogno simile. –

risposta

1

Sembra che sia "Elimina" invece di "Rimuovi". Vedere questo MSDN article

Project prj = dte.Solution.Projects.Item(1); 
prj.Delete(); 
+3

FTA: "Si noti che questo metodo non è attualmente implementato." –

4

Destra, so di essere in ritardo alla festa, ma ho appena affrontare questo stesso problema per un pacchetto di NuGet interna che ho scritto, e penso di aver trovato il modo per farlo.

Infatti Microsoft hanno (utilmente) ha lasciato il metodo Delete unimplemented, e come abbiamo entrambi scoperto, nel tentativo di chiamare il metodo Remove sull'interfaccia Solution2 lancia una miriade emozionante di errori a seconda del contesto!

Tuttavia quello che ho trovato è che invocare direttamente il metodo Remove definito nella SolutionClass realtà non funziona (nonostante il suo essere documentato da Microsoft come esclusivo uso interno. Ma hey, quando ogni altra opzione è esaurito ...). L'unico problema è che il legante runtime anche a volte sembra non riuscire a risolvere il sovraccarico di metodo, che produce l'errore:

No overload for method 'Remove' takes 1 arguments 

Tutto ciò significa che è il momento per ottenere i nostri pastelli riflessione fuori! Il codice è simile al seguente:

$removeMethod = [EnvDTE.SolutionClass].GetMethod("Remove"); 
$solution = $dte.Solution; 
$toremove = ($solution.Projects | where ProjectName -eq "<whatever>"); 
$removeMethod.Invoke($solution, @($toremove)); 

Dopo una giornata di varie iterazioni (molti molto somiglianti a quelle in questione) e vari gradi di successo (a seconda se mi stava eseguendo all'interno del gestore dei pacchetti, da dentro lo script di installazione o all'interno di un debugger), quanto sopra è quello che ho trovato per essere più affidabile.

Una cosa da notare è che, poiché il metodo di riflesso è definito in EnvDTE.SolutionClass, passandogli un EnvDTE._Solution o EnvDTE80.Solution2 genera un errore Type mismatch, così purtroppo non è possibile ottenere la vostra $solution oggetto dal Get-Interface cmdlet (che di solito è il mio metodo preferito) . Fare il cast a [EnvDTE.SolutionClass] ove possibile è ovviamente preferibile, ma di nuovo ho trovato diversi gradi di successo nel farlo. Da qui il leggermente sciatto $solution = $dte.Solution sopra.

Spero che questo sia utile a qualcun altro!