2013-07-21 34 views
6

Tôi đang cố gắng sử dụng PowerShell trong Package Manager Console để viết kịch bản việc xóa một dự án khỏi một giải pháp và tôi gặp phải một thời gian khó khăn đáng ngạc nhiên.Xóa dự án khỏi giải pháp thông qua Package Manager Console

tôi có thể dễ dàng thêm một dự án bởi

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

Bây giờ tôi muốn được loại bỏ một dự án và không thể có được bất cứ điều gì để làm việc.

Tôi đã thử một số điều bao gồm:

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

Tôi đã cố gắng kết hợp khác, nhưng tôi quay rõ ràng bánh xe của tôi. Tôi đánh giá cao bất kỳ đề xuất nào.

+0

Bạn có làm việc này không? Tôi có nhu cầu tương tự. –

Trả lời

1

Có vẻ như đó là "Xóa" thay vì "Xóa". Xem này MSDN article

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

FTA: "Lưu ý rằng phương pháp này hiện không được triển khai". –

4

Phải, tôi biết tôi là muộn để bên nhưng tôi đã chỉ được giải quyết vấn đề này tương tự cho một gói NuGet nội bộ chúng tôi đã viết, và tôi nghĩ rằng tôi đã tìm thấy như thế nào để làm điều đó. Thực tế, Microsoft có (helpfully) để lại phương thức Delete unimplemented, và như chúng ta đã tìm thấy, cố gắng gọi phương thức Remove trên giao diện Solution2 ném vô số lỗi thú vị tùy thuộc vào ngữ cảnh!

Tuy nhiên những gì tôi tìm thấy là gọi trực tiếp phương thức Remove được xác định trong SolutionClass thực sự hoạt động (mặc dù tài liệu của Microsoft chỉ được sử dụng nội bộ. Nhưng hey, khi mọi tùy chọn khác cạn kiệt ...). Trở ngại duy nhất là các chất kết dính runtime cũng đôi khi dường như thất bại trong việc giải quyết tình trạng quá tải phương pháp, sản xuất các lỗi:

No overload for method 'Remove' takes 1 arguments 

Tất cả điều đó có nghĩa rằng đó là thời gian để có được bút chì màu phản chiếu của chúng tôi ra! Mã này trông như thế này:

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

Sau một ngày lặp đi lặp lại khác nhau (nhiều gần giống với những người trong câu hỏi) và mức độ thành công khác nhau (tùy thuộc vào việc tôi đã thực hiện bên trong quản lý gói, từ bên trong kịch bản cài đặt hoặc trong một trình gỡ rối), ở trên là những gì tôi thấy là đáng tin cậy nhất.

Một điều cần lưu ý là bởi vì phương pháp phản ánh được định nghĩa trong EnvDTE.SolutionClass, đi qua nó một EnvDTE._Solution hoặc EnvDTE80.Solution2 ném một lỗi Type mismatch, vì vậy không may bạn không thể có được đối tượng $solution của bạn bằng các Get-Interface cmdlet (mà thường là phương pháp ưa thích của tôi) . Làm cho các diễn viên để [EnvDTE.SolutionClass] bất cứ nơi nào có thể là rõ ràng là thích hợp hơn, nhưng một lần nữa tôi đã tìm thấy mức độ khác nhau của sự thành công trong việc làm như vậy. Do đó hơi sloppy $solution = $dte.Solution ở trên.

Hy vọng điều này hữu ích cho người khác!

Các vấn đề liên quan