2012-05-30 45 views
6

Tôi đang tìm kiếm thêm một ngôn ngữ lập trình mới cho visual sudio 2010 và tôi hơi bối rối về cách tiếp cận tốt nhất để thực hiện.Visual Studio 2010 MEF so với MPF?

Tôi đã xem xét MPF và tìm thấy một số ví dụ về cách làm nổi bật cú pháp, liên kết một trình phân tích cú pháp bên ngoài, v.v ... và có vẻ khá đơn giản.

Sau đó, tôi đọc về một cái gì đó gọi là MEF và làm thế nào nó là mô hình mở rộng mới cho studio trực quan. Tôi đã chơi với nó và tôi đã làm nổi bật cú pháp của mình bằng cách làm theo một số mẫu. Bây giờ, với MEF tôi bị mất về cách tôi liên kết trong phân tích cú pháp của tôi cho langauge của tôi, giống như MPF bằng cách sử dụng ParseSOurce, vv Tôi đang sử dụng ANTLR btw.

MEF chỉ dành cho các khía cạnh trực quan của trình chỉnh sửa như đánh dấu, trang sức, v.v ... hay là có thể/nên thực hiện các dịch vụ ngôn ngữ với nó?

Từ những gì tôi thu thập MEF là cách tiếp cận mới được đề xuất nhưng có vẻ khó khăn hơn để tạo ra một ngôn ngữ mới so với MPF thông thường. MPF vẫn là một cách tiếp cận tốt?

+3

Một trong những cách tốt nhất là nghiên cứu cách dự án hiện tại thực hiện. Hãy thử xem xét IronPython và "Công cụ Python cho Visual Studio" để xem cách họ thêm hỗ trợ cho ngôn ngữ python vào VS. –

+0

Câu hỏi này vẫn thiếu câu trả lời được chấp nhận. Câu trả lời của tôi có giúp bạn hay bạn cần thêm chi tiết? = 3 –

+0

Yikes, tôi đã quên mất điều này, đã lâu rồi. Câu trả lời của bạn rất hữu ích cảm ơn bạn và tôi đã đi theo lộ trình MPF. –

Trả lời

4

MEF (Khung mở rộng được quản lý) là phương pháp lập trình chung trong .NET để mở rộng các chương trình, như Visual Studio. VS gói/phần mở rộng có thể sử dụng các lớp VS-MEF mới hơn (hợp đồng) thay vì các lớp MPF. MEF được công nhận bởi các lớp được trang trí với các thuộc tính [Export]. Nói chung, bạn kế thừa một lớp cụ thể như một mục có thể in màu và xuất nó sang Visual Studio, sau đó tìm kiếm tất cả các xuất khẩu trong gói MEF của bạn và nhập khẩu chúng.

MPF (Khung gói được quản lý) giống như hệ thống lớp xung quanh trình bao bọc COM cũ hơn của mô hình mở rộng VS không quản lý/gốc. Bạn lập trình mở rộng Visual Studio bằng cách nhận các dịch vụ và thực hiện các phương thức của các lớp MPF (các lớp MPF lần lượt thực hiện các giao diện COM giống như trình bao bọc COM của VS. Ví dụ LanguageService thực hiện IVsLanguageInfo và một số giao diện khác, nhưng nó chỉ đơn giản là "thu thập" các phương thức của những giao diện mà bạn có thể ghi đè trong lớp thực hiện LanguageService).

Nếu bạn muốn thực hiện một ngôn ngữ lập trình hoàn chỉnh, bạn sẽ kết hợp MPF và MEF. Bạn sử dụng MEF cho các phần biên tập như tokenization (cần cho cú pháp Syntax), phác thảo, kết hợp cú đúp và MPF cho các công cụ VS khác như cửa sổ công cụ mới, trang thuộc tính, v.v.

Thay vì MPF bạn cũng có thể sử dụng trình bao bọc COM cũ hơn, nhưng các lớp MPF đã làm một số công việc COM cho bạn mà bạn sẽ phải đối phó với nếu bạn chọn trình bao bọc COM.

Bạn cũng có thể triển khai trình mã thông báo, v.v. với MPF, nhưng tôi đã thử nó và thấy nó không rõ ràng hơn MEF. Nếu bạn hỏi tôi, nó khó hơn nhiều, và đòi hỏi nhiều braindamage hơn MEF, nhưng tôi vẫn chưa nhận được như xa với MEF như tôi đã nhận với MPF.

Đó là một chút bối rối với bản thân vì MSDN trộn các bài viết của MEF và MPF như tôi nhận thấy. Bạn cần phải xem rất cẩn thận trong đó phụ của MSDN bạn đi, bạn có thể dễ dàng chuyển từ một loại MEF sang MPF một cách tình cờ. Tuy nhiên, MSDN gợi ý cho bạn về những gì đang diễn ra trong một số bài viết chung về việc mở rộng VS, ví dụ tại đây: http://msdn.microsoft.com/en-us/library/cc138569.aspx

0

Tôi hiện đang thực hiện một dịch vụ ngôn ngữ độc quyền với MEF (trong VS2013).

Ngoài việc đánh dấu cú pháp (bạn có thể làm với một số ITagger<ClassificationTag>) và một vài giao diện MEF có mục đích cụ thể khác (ví dụ:cho các trang tùy chọn và các loại intelliSense khác nhau mà bạn thực hiện khi cần, để thực hiện những việc như phân tích cú pháp nền, bạn thường thực hiện IVsTextViewCreationListener và thực hiện công việc khi mở một tệp; cách khác, bạn có thể duyệt qua hệ thống phân cấp dự án của mình trong nền bằng cách sử dụng phương thức Initialize của gói của bạn làm điểm nhập.

Tính năng Intellisense, v.v. thường sẽ yêu cầu bạn trả lời một lệnh nhất định (hoặc giám sát tổ hợp phím để biết khi nào cần bật lên hộp danh sách hoàn thành, ví dụ); bạn có thể xử lý điều này bằng cách thực hiện IOleCommandTarget và xử lý các lệnh có liên quan (bạn móc trình xử lý lệnh của mình theo cách thủ công bằng cách gọi AddCommandFilter trên IVsTextView khi chế độ xem văn bản được tạo).

Cho đến nay tôi chưa gặp phải bất kỳ điều gì tôi không thể thực hiện qua MEF (ngoại trừ những điều không thể làm được); Tôi chưa bao giờ thực sự nhìn vào MPF, vì tôi không cần nó.

(Lưu ý rằng vào cuối ngày, các mã có xu hướng giống như một canh của MEF ống nước, giao diện SDK VS và các lớp helper, và EnvDTE goop.)

0

Sử dụng MEF cho các tính năng được tiếp xúc qua MEF. Các tính năng khác được xử lý trên cơ sở từng trường hợp cụ thể (hỏi một câu hỏi cụ thể nếu bạn gặp sự cố khi triển khai một tính năng cụ thể). Điều duy nhất tôi vẫn sử dụng MPF là hệ thống dự án (MPF cho dự án, hoặc MPFProj). Để xử lý phân tích cú pháp nền, tôi khuyên bạn nên xem triển khai BackgroundParser của tôi (giấy phép MIT). Nó hoạt động khá tốt, mặc dù nhìn lại tôi muốn tôi sử dụng TPL cho nó và thực hiện ReParseImpl trả lại một Task thay vì thực hiện đồng bộ.

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