2013-07-21 27 views
6

Próbuję użyć powłoki powershell w konsoli programu Package Manager, aby skrypty usunąć projekt z rozwiązania i mam zaskakująco ciężko.Usuwanie projektu z rozwiązania za pomocą konsoli menedżera pakietów

mogę łatwo dodać projektu przez

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

Teraz chcę być usunięcie projektu i nie może dostać coś do pracy.

Próbowałem wielu rzeczy, w tym:

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'.

Próbowałem innych kombinacji, ale ja wyraźnie przędzenia moich kół. Doceniam wszelkie sugestie.

+0

Czy to działa? Mam podobną potrzebę. –

Odpowiedz

1

Wygląda na to, że jest "Usuń" zamiast "Usuń". Zobacz ten MSDN article

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

FTA: "Zauważ, że ta metoda nie jest obecnie zaimplementowana." –

4

rację, wiem, że jestem późno do partii, ale ja właśnie rozwiązania tego samego problemu dla wewnętrznego pakietu Nuget pisaliśmy, i myślę, że znalazłem sposób aby to zrobić.

Rzeczywiście Microsoft nie (pomocniczo) opuścił metody Delete unimplemented, a jak już zarówno znalezione, próbując wywołać metodę Remove na interfejsie Solution2 rzuca ekscytujących mnóstwo błędów w zależności od kontekstu!

Jednak znalazłem to, że bezpośrednio powołując się na metodę Remove zdefiniowaną w SolutionClass, faktycznie działa (pomimo tego, że jest udokumentowana przez Microsoft tylko do użytku wewnętrznego, ale hej, gdy wszystkie inne opcje są wyczerpane ...). Jedynym haczykiem jest to, że spoiwo Runtime czasami wydaje się nie do rozwiązania przeciążenie metodzie wytwarzania błąd:

No overload for method 'Remove' takes 1 arguments 

Wszystko to oznacza, że ​​nadszedł czas, aby dostać nasze kredki odbicie na zewnątrz! Kod wygląda następująco:

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

Po dniu różnych iteracji (wiele ściśle przypominających te w pytaniu) i różnym powodzeniem (w zależności od tego, czy ja wykonywania wewnątrz menadżera pakietów, od wewnątrz skryptu instalacyjnego lub w obrębie debuggera), powyższe stwierdzenia są najbardziej wiarygodne.

Jedną rzeczą, aby pamiętać, że ponieważ odbite metoda jest zdefiniowana w EnvDTE.SolutionClass, przekazując go EnvDTE._Solution lub EnvDTE80.Solution2 wyrzuca błąd Type mismatch, więc niestety nie można uzyskać swój obiekt $solution przez Get-Interface cmdletu (który jest zwykle moja preferowana metoda) . Wykonanie obsady na [EnvDTE.SolutionClass], gdzie tylko jest to możliwe, jest oczywiście preferowane, ale w tym przypadku odniosłem różne sukcesy. Stąd lekko niechlujny $solution = $dte.Solution powyżej.

Mam nadzieję, że przyda się to komuś innemu!