2013-07-21 19 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を残し、我々は両方の発見したとして、Solution2インターフェイス上Removeメソッドを呼び出そうとすると、コンテキストに応じたエラーのエキサイティングな無数を投げます!

しかし、私が発見したものを(...他のすべてのオプションがなくなったとき、そのは内部使用のみとMicrosoftが文書化されているにもかかわらず。でもねえ)直接SolutionClassで定義されてRemoveメソッドを呼び出すことは、実際に動作しないということです。唯一の難点は、ランタイムバインダーはまた時々エラーを生成、メソッドオーバーロードの解決に失敗しているようだということです。

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._SolutionEnvDTE80.Solution2それを渡すとType mismatchエラーがスローされますので、残念ながらあなたは(通常は私の好ましい方法である)Get-Interfaceコマンドレットによって、あなたの$solutionオブジェクトを取得することができないということです。可能であれば、可能であれば[EnvDTE.SolutionClass]へのキャストを行うのが望ましいですが、やはり私はそうすることで様々な成功を収めています。したがって、上記のやや汚れた$solution = $dte.Solution

これは他の人にも便利ですか?

関連する問題