2013-07-21 5 views
6

Я пытаюсь использовать powershell в консоли диспетчера пакетов, чтобы сценарий удаления проекта из решения, и у меня есть удивительно трудное время.Удалить проект из решения через консоль диспетчера пакетов

Я могу легко добавить проект по

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

Теперь я хочу быть удалить проект и не может получить что-нибудь работать.

Я попробовал несколько вещей, в том числе:

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

Я пробовал другие комбинации, но я четко спиннинг мои колеса. Я ценю любые предложения.

+0

Вы получили это от работы? У меня такая же потребность. –

ответ

1

Похоже, что это «Удалить» вместо «Удалить». Смотрите эту MSDN article

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

FTA: «Обратите внимание, что этот метод в настоящее время не реализован». –

4

Право, я знаю, что я опоздал на вечеринку, но я только что решение этой же проблемы для внутреннего пакета NuGet мы писали, и я думаю, что я нашел, как сделать это.

Действительно Microsoft есть (услужливо) покинул Delete метод unimplemented, и, как мы оба нашли, пытаясь вызвать метод Remove на интерфейсе Solution2 бросает захватывающее множество ошибок в зависимости от контекста!

Однако я обнаружил, что прямое обращение к методу Remove, определенному в SolutionClass, действительно работает (несмотря на то, что он был документирован только Microsoft как внутреннее использование, но эй, когда каждый другой вариант исчерпан ...). Единственная загвоздка в том, что во время выполнения связующего иногда, кажется, не в состоянии разрешить перегрузку методы, производя ошибку:

No overload for method 'Remove' takes 1 arguments 

Все это означает, что пришло время, чтобы получить наши отражения мелков вне! Код выглядит следующим образом:

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

После дня различных итераций (многие очень похожий на те, в вопросе) и различной степенью успеха (в зависимости от того, был ли я выполняется внутри менеджера пакетов, внутри установки скрипта или в отладчике), это то, что я считаю наиболее надежным.

Единственное, что следует отметить, что, поскольку отраженный метод определен в EnvDTE.SolutionClass, передавая ей EnvDTE._Solution или EnvDTE80.Solution2 бросает ошибку Type mismatch, поэтому, к сожалению, вы не можете получить свой $solution объект со стороны Get-Interface командлета (который, как правило, мой предпочтительный метод) , Очевидно, что делать приведение к [EnvDTE.SolutionClass] предпочтительнее, но я снова нашел переменную степень успеха. Отсюда немного небрежный $solution = $dte.Solution выше.

Надеюсь, это полезно кому-то еще!

 Смежные вопросы

  • Нет связанных вопросов^_^