Visual Studio Tự động hóa và mở rộng

Chia sẻ: Lại Văn Nghĩa | Ngày: | Loại File: DOC | Số trang:30

0
173
lượt xem
97
download

Visual Studio Tự động hóa và mở rộng

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tôi đã từ lâu đã là fan hâm mộ của PLC (Dự án Đường dây Số lượt truy cập) từ WndTabs.com. Tiện ích này ít đã giúp tôi theo dõi và thậm chí đo tiến độ của dự án phát triển cho một vài năm nay. Tôi đã được kiên nhẫn chờ đợi cho Oz Solomon, tác giả của PLC, để phát hành một bản cập nhật cho Visual Studio 2005. Cuối cùng tôi đã tìm thấy một số thời gian rảnh ngày hôm nay và quyết định xem liệu tôi có thể cập nh t...

Chủ đề:
Lưu

Nội dung Text: Visual Studio Tự động hóa và mở rộng

  1. • Tải tập tin nguồn gốc - 552,22 KB • Tải file nguồn mới - 1,45 MB • Tải về cài đặt - 381,16 KB • Download Line Số lượt truy cập 2008 (precompiled) - 72,7 KB Nền Tôi đã từ lâu đã là fan hâm mộ của PLC (Dự án Đường dây Số lượt truy cập) từ WndTabs.com. Tiện ích này ít đã giúp tôi theo dõi và thậm chí đo tiến độ của dự án phát triển cho một vài năm nay. Tôi đã được kiên nhẫn chờ đợi cho Oz Solomon, tác giả của PLC, để phát hành một bản cập nhật cho Visual Studio 2005. Cuối cùng tôi đã tìm thấy một số thời gian rảnh ngày hôm nay và quyết định xem liệu tôi có thể cập
  2. nhật nó bản thân mình. Nó không đi lâu dài cho tôi để nhận ra tôi có lẽ có thể viết một dòng riêng của tôi truy cập add-in trong thời gian ít hơn nó sẽ đưa tôi để tìm ra mã Oz và di chuyển mã hiện tại của mình để một phiên bản VS 2005. Vì vậy, ở đây tôi, viết cho tất cả các bạn lập trình tốt về VS đầu tiên của tôi gắn trong. Tôi hy vọng bạn tìm thấy cả hai bài viết này và các sản phẩm đằng sau nó có ích. Tôi hoan nghênh các ý kiến, cải tiến và đề nghị, như tôi sẽ được tiếp tục cải thiện tiện ích này rất ít thời gian. Visual Studio Tự động hóa và mở rộng Một trong những điều lớn nhất về Visual Studio là mở rộng của nó. Nhiều bạn đã sẽ được phần nào quen với một số tính năng tôi sẽ được bao gồm trong bài viết này. Nếu bạn đã từng viết add-in cho mọi phiên bản của Visual Studio, hoặc thậm chí nếu bạn có bất kỳ văn bản macro để giúp sắp xếp công việc của bạn, bạn đã sử dụng tự động hóa và mở rộng đối tượng mà Visual Studio cung cấp. Các tính năng này phổ biến nhất được gọi là DTE, hoặc thời gian thiết kế môi trường. Đối tượng này cho thấy nhiều tất cả các bộ phận khác nhau và các mẩu UI Visual Studio và các công cụ để các lập trình viên thông minh. Sử dụng các đối tượng DTE, bạn có thể lập trình điều khiển chỉ là về mọi thứ trong Visual Studio, từ thanh công cụ, lắp ghép cửa sổ công cụ, và thậm chí sửa các tập tin hoặc khởi biên dịch. Một trong những ứng dụng đơn giản của đối tượng DTE là thông qua các macro. Sử dụng các macro, bạn có thể làm được khá nhiều, từ công việc đơn giản như tìm và thay thế cho các nhiệm vụ phức tạp như tạo nhận xét tài sản cho tất cả các biến của bạn ngoại trừ các loại cụ thể. DTE cùng một đối tượng đó là tiếp xúc qua các macro cũng được tiếp xúc thông qua các tiện ích trong các dự án mở rộng. Tạo một Visual Studio Add-in với Add-in Wizard, bạn có thể tạo vỏ cơ bản của những gì bạn có thể gọi là vĩ mô rất tiên tiến.
  3. Visual Studio Add-in có thể được viết bằng bất kỳ ngôn ngữ, mà bạn có thể chọn trong khi chạy các Add-in Wizard. Thuật sĩ sẽ giới thiệu bạn với một số tùy chọn khác, quá. Phiên bản này của bài viết này sẽ không bao gồm các chi tiết của những gì các tùy chọn nào khác, không được nêu ra. Đủ để nói, bạn có tùy chọn gây tiện ích của bạn để chạy khi khởi động Visual Studio. Bạn cũng có thể thêm một nút thanh công cụ cho các tiện ích của bạn trong đó sẽ xuất hiện khi VS khởi động, cho dù có được bằng tay hoặc tự động.
  4. Tạo một Add-in Sau khi kết thúc các Add-in Wizard, bạn sẽ có một dự án mới với một tập tin quan tâm: Connect.cs. Tập tin này ít là điểm khởi đầu của bất kỳ Visual Studio add-in. Nó thực hiện một vài giao diện chính và cung cấp một số mã bắt đầu trong một vài phương pháp chủ chốt. Phương pháp quan trọng nhất bây giờ là: Sụp đổ OnConnection (đối tượng ứng dụng, ext_ConnectMode connectMode, đối tượng addInInst, ref Array tùy chỉnh) Khi Visual Studio bắt đầu tiện ích của bạn tại, phương pháp này là điều đầu tiên nó gọi. Nó là ở đây là các mã khởi tạo nhu cầu để đi. Bạn có kỹ thuật có thể làm bất cứ điều gì bạn cần để ở đây, miễn là nó đã làm việc trong các giới hạn áp đặt bởi các mô hình tự động của Visual Studio. Đây là một cái gì đó mà tôi bản thân mình chưa đầy đủ đại biểu nêu ra, nhưng đôi khi những điều cần phải được thực hiện một cách nhất định. Hiện nay, phương pháp này nên được trước dân cư với mã được tạo bởi các Add-in Wizard, mà bắt đầu thực hiện bất kỳ tùy chọn bạn đã chọn (như thêm một mục trình đơn Tools, ví dụ). Hầu hết các mã trong OnConnection cũng là tài liệu, do đó, chúng tôi sẽ không đi vào giải thích chi tiết về tất cả của nó. Một điều quan trọng của các lưu ý, tuy nhiên, là ba dòng đầu tiên: Sụp đổ _applicationObject = (DTE2) ứng dụng;
  5. _addInInstance = (addin) addInInst; nếu(connectMode == ext_ConnectMode.ext_cm_UISetup) ( // ... } Dòng lưu trữ đầu tiên đối tượng DTE, được cung cấp bởi Visual Studio khi nó khởi chạy các tiện ích trong. Dòng cache dụ thứ hai của các tiện ích của riêng mình, mà thường được yêu cầu cho nhiều cuộc gọi bạn có thể thực hiện từ tiện ích của bạn trong của mã. Dòng thứ ba, nếu tuyên bố, cho phép để chế biến có điều kiện khi add- in được bắt đầu. Visual Studio sẽ thường bắt đầu một tiện ích trong một vài lần. Lần đầu tiên cho phép nó để thiết lập giao diện riêng của mình với các trình đơn, các nút thanh công cụ, bắt đầu vv up bổ sung gây ra khi các tiện ích trong thực sự là đang chạy, mà có thể xảy ra theo hai cách khác nhau: tự động khi VS bắt đầu hoặc thông qua một số quy trình khác sau khi VS đã bắt đầu. Phần còn lại của mã đó đã tồn tại trong OnConnection Phương pháp là nhận xét và sẽ khác nhau tuỳ thuộc vào bạn lựa chọn những gì đã chọn trong trình wizard. Số lượt truy cập cho Đường dây add-in, chúng tôi sẽ thực sự được gỡ bỏ tất cả các mã được tạo ra và thay thế nó bằng riêng của chúng tôi. Nếu bạn muốn làm theo cùng với bài viết này như tôi giải thích cách tạo một cửa sổ công cụ tiện ích trong, tạo ra một tiện ích mới trong dự án bây giờ với các cài đặt sau đây: Tên dự án: LineCounterAddin Ngôn ngữ: C # Tên: Đường dây Số lượt truy cập Mô tả: Đường dây Số lượt truy cập 2005 - Mã Nguồn Line Số lượt truy cập Tùy chọn khác: Để lại lúc mặc định Khi dự án đã được tạo ra, và thêm những tài liệu tham khảo sau đây: Sụp đổ System.Drawing System.Windows.Forms Cuối cùng, thêm một người dùng mới kiểm soát được đặt tên LineCounterBrowser. Điều này kiểm soát người dùng sẽ được giao diện chính của tiện ích của chúng tôi vào, và nó hoạt động giống như bất kỳ mẫu Windows bình thường. Bạn có thể thiết kế, thêm xử lý sự kiện, vv với các nhà thiết kế thị giác. Chúng tôi sẽ không đi vào chi tiết của tòa nhà điều khiển người dùng trong bài viết này, như bạn có thể tải về toàn bộ mã nguồn ở trên cùng của trang này. Để bây giờ, chỉ cần mở mã nguồn của điều khiển người dùng mới của bạn và thêm mã này: Sụp đổ # khu vực Biến tư nhân DTE2 m_dte; // Tham chiếu đến các đối tượng Visual Studio DTE # endregion
  6. /// /// Nhận VS DTE đối tượng /// công cộng DTE2 DTE ( đặt ( m_dte = giá trị; ) ) # endregion Chúng tôi sẽ không cần bất cứ điều gì khác trong mã nguồn của người dùng điều khiển cho bây giờ. Điều này sở hữu và biến tương ứng cung cấp một cách để chúng tôi vượt qua trong các tài liệu tham khảo từ các đối tượng DTE Kết nối lớp học đến lớp giao diện người dùng của chúng tôi. Chúng tôi sẽ thực sự thiết lập các tài sản trong OnConnection Phương pháp của Kết nối lớp. Mã đầy đủ OnConnection nên được như sau. Đó là nhận xét tốt, để giải thích thêm không nên cần thiết. Sụp đổ công cộng void OnConnection (đối tượng ứng dụng, ext_ConnectMode connectMode, đối tượng addInInst, ref Array tùy chỉnh) ( // Cache DTE và tiện ích trong trường hợp các đối tượng _applicationObject = (DTE2) ứng dụng; _addInInstance = (addin) addInInst; // Chỉ thực thi mã khởi động, nếu chế độ kết nối là một chế độ khởi động nếu (connectMode == ext_ConnectMode.ext_cm_AfterStartup | | ConnectMode == ext_ConnectMode.ext_cm_Startup) ( cố gắng { // Khai báo biến string ctrlProgID, guidStr; EnvDTE80.Windows2 toolWins; đối tượng objTemp = null; // Các ProgID kiểm soát cho người sử dụng kiểm soát ctrlProgID = "LineCounterAddin.LineCounterBrowser "; // Guid này phải là duy nhất cho mỗi cửa sổ công cụ khác nhau, // nhưng bạn có thể sử dụng cùng một guid cho cửa sổ cùng một công cụ. // Guid này có thể được sử dụng cho chỉ mục của bộ sưu tập các cửa sổ, // Ví dụ: applicationObject.Windows.Item (guidstr) guidStr = "(2C73C576-6153-4a2d-82FE-9D54F4B6AD09) "; // Nhận thi công lắp ráp ... System.Reflection.Assembly asm =
  7. System.Reflection.Assembly.GetExecutingAssembly (); // Get Visual Studio của bộ sưu tập toàn cầu của cửa sổ công cụ ... toolWins = (Windows2) _applicationObject.Windows; // Tạo một cửa sổ công cụ mới, nhúng vào // LineCounterBrowser kiểm soát bên trong nó ... m_toolWin = toolWins.CreateToolWindow2 ( _addInInstance, asm.Location, ctrlProgID, "Đường dây Số lượt truy cập ", guidStr, ref objTemp); // Vượt qua các đối tượng DTE cho người dùng điều khiển ... LineCounterBrowser trình duyệt = (LineCounterBrowser) objTemp; browser.DTE = _applicationObject; // và thiết lập công cụ mặc định kích thước cửa sổ ... m_toolWin.Visible = thật sự; // PHẢI làm cho cửa sổ công cụ // có thể nhìn thấy trước khi sử dụng bất kỳ // phương pháp hay tài sản, // trường hợp ngoại lệ nếu không sẽ // xảy ra. // Bạn có thể đặt kích thước ban đầu của cửa sổ công cụ //m_toolWin.Height = 400; //m_toolWin.Width = 600; } bắt kịp (Exception) ( Console.WriteLine (ex.Message); Console.WriteLine (ex.StackTrace); ) // Tạo các mục trình đơn và thanh công cụ để bắt đầu truy cập dòng nếu (connectMode == ext_ConnectMode.ext_cm_UISetup) ( // Nhận được lệnh thanh bộ sưu tập, và tìm thấy // Menubar lệnh thanh CommandBars cmdBars = ((Microsoft.VisualStudio.CommandBars.CommandBars) _applicationObject.CommandBars); CommandBar menuBar = cmdBars ["Menubar "]; // Thêm lệnh để 'menu Tools' CommandBarPopup toolsPopup = (CommandBarPopup) menuBar.Controls ["Công cụ "]; AddPopupCommand (toolsPopup, "LineCounterAddin ",
  8. "Đường dây Số lượt truy cập 2005 ", "Số lượt truy cập Line sẽ hiển thị cửa sổ 2005. ", 1); // Thêm thanh lệnh mới với nút CommandBar ButtonBar = AddCommandBar ("LineCounterAddinToolbar ", MsoBarPosition.msoBarFloating); AddToolbarCommand (ButtonBar, "LineCounterAddinButton ", "Đường dây Số lượt truy cập 2005 ", "Số lượt truy cập Line sẽ hiển thị cửa sổ 2005. ", 1); } } } // Cửa sổ công cụ đối tượng tư nhân EnvDTE.Window m_toolWin; Cái OnConnection Phương pháp này sẽ được chạy nhiều lần tại các điểm khác nhau trong suốt thời gian thực hiện của Visual Studio. Chúng tôi đang liên quan với hai lý do có thể cho phương pháp đang được gọi là: một lần cho giao diện Thiết lập và một lần để khởi chạy. Khi OnConnection Phương pháp này được gọi là cho giao diện Thiết lập, chúng tôi sẽ muốn cập nhật giao diện người dùng Visual Studio với một mục trình đơn và nút thanh công cụ để thêm vào của chúng tôi tại. Điều này được thực hiện trong lần thứ hai nếu tuyên bố của OnConnection phương pháp. Khi OnConnection Phương pháp này được gọi là cho Startup - trong đó có hai phương pháp khác nhau: khi bắt đầu và sau khi VS VS bắt đầu - chúng tôi muốn hiển thị thêm của chúng tôi tại. Khi thực hiện giao diện Thiết lập, tôi đã tạo ra một vài tư nhân helper chức năng để đơn giản hóa quá trình. Dưới đây, bạn có thể tìm thấy nhiều phương pháp đó sẽ tạo thuận lợi cho việc tạo ra các mới CommandBars trong Visual Studio, cũng như cách thêm lệnh cho những quán bar. Các chức năng này bao gồm việc thêm mục trình đơn mới vào trình đơn. Mã này cũng đủ là nhận xét rằng nó khá tự giải thích. Một điều cần lưu ý về các chức năng này là họ giả định tiện ích của bạn trong dự án có một tùy chỉnh giao diện người dùng, lắp ráp có chứa tất cả các hình ảnh bạn muốn sử dụng cho các lệnh của bạn, các mục trình đơn và cả hai nút trên thanh công cụ. Tôi sẽ giải thích làm thế nào để thêm các biểu tượng tùy chỉnh sau. Sụp đổ /// /// Thêm một thanh lệnh đến giao diện VS2005. /// /// Tên của thanh lệnh /// Ban lệnh thanh định vị /// tư nhân CommandBar AddCommandBar (string tên, MsoBarPosition vị trí) ( // Nhận được lệnh thanh bộ sưu tập CommandBars cmdBars = ((Microsoft.VisualStudio.CommandBars.CommandBars) _applicationObject.CommandBars); CommandBar thanh = null;
  9. cố gắng { cố gắng { // Tạo CommandBar mới bar = cmdBars.Add (tên, vị trí, sai, sai); } bắt kịp (ArgumentException) ( // Hãy thử tìm một CommandBar hiện bar = cmdBars [tên]; ) ) bắt kịp { } trở về bar; ) /// /// Thêm một menu để giao diện VS2005. /// /// Tên của trình đơn /// tư nhân CommandBar AddCommandMenu (string tên) ( // Nhận được lệnh thanh bộ sưu tập CommandBars cmdBars = ((Microsoft.VisualStudio.CommandBars.CommandBars) _applicationObject.CommandBars); CommandBar đơn = null; cố gắng { cố gắng { // Tạo CommandBar mới menu = cmdBars.Add (tên, MsoBarPosition.msoBarPopup, sai, sai); } bắt kịp (ArgumentException) ( // Hãy thử tìm một CommandBar hiện menu = cmdBars [tên]; ) ) bắt kịp { } trở về đơn; ) /// /// Thêm một lệnh cho một popup menu trong VS2005.
  10. /// /// Popup menu để thêm lệnh vào. /// Tên của các lệnh mới. /// Các nhãn văn bản của lệnh. /// Tooltip cho các lệnh. /// Các chỉ số biểu tượng, mà nên kết hợp các nguồn tài nguyên ID trong các tiện ích, lắp ráp nguồn in. private void AddPopupCommand ( CommandBarPopup popup, chuỗi tên, chuỗi nhãn, string ttip, int iconIdx) ( / / Đừng cố gắng thêm lệnh cho một đơn null nếu (popup == null) return; / / Get lệnh thu Commands2 lệnh = (Commands2) _applicationObject.Commands; đối tượng [] contextGUIDS = mới đối tượng [] (); cố gắng ( / / Thêm lệnh Lệnh lệnh = commands.AddNamedCommand2 (_addInInstance, tên, nhãn, ttip, false, iconIdx, ref contextGUIDS, (int) vsCommandStatus.vsCommandStatusSupported + (int) vsCommandStatus.vsCommandStatusEnabled, (int) vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton); if ((lệnh! = null) & & (popup = null))! ( command.AddControl (popup.CommandBar, 1); ) ) catch (ArgumentException) ( / / Lệnh đã tồn tại, do đó, bỏ qua ) ) / / / / / / Thêm một lệnh cho một thanh công cụ trong VS2005. / / / /// Thanh để thêm lệnh vào. /// Tên của các lệnh mới. /// Các nhãn văn bản của lệnh. /// Tooltip cho các lệnh. /// Các chỉ số biểu tượng, mà nên kết hợp các nguồn tài nguyên ID trong các tiện ích, lắp ráp nguồn in. private void AddToolbarCommand (CommandBar bar, chuỗi tên, chuỗi nhãn, string ttip, int iconIdx) ( / / Đừng cố gắng thêm lệnh đến một thanh null nếu (bar == null) return;
  11. / / Get lệnh thu Commands2 lệnh = (Commands2) _applicationObject.Commands; đối tượng [] contextGUIDS = mới đối tượng [] (); cố gắng ( / / Thêm lệnh Lệnh lệnh = commands.AddNamedCommand2 (_addInInstance, tên, nhãn, ttip, false, iconIdx, ref contextGUIDS, (int) vsCommandStatus.vsCommandStatusSupported + (int) vsCommandStatus.vsCommandStatusEnabled, (int) vsCommandStyle.vsCommandStylePict, vsCommandControlType.vsCommandControlTypeButton); nếu (lệnh null = & & thanh! null =!) ( command.AddControl (bar, 1); ) ) catch (ArgumentException) ( / / Lệnh đã tồn tại, do đó, bỏ qua ) ) Bây giờ chúng ta có mã đúng tích hợp thêm của chúng tôi ở trong giao diện người sử dụng Visual Studio và hiển thị tiện ích của chúng tôi trong khi được yêu cầu, chúng tôi cần phải thêm lệnh xử lý. Xử lý các lệnh trong một Visual Studio add-in là một nhiệm vụ khá đơn giản. Cái IDTCommandTarget giao diện, mà chúng tôi Kết nối lớp thực hiện, cung cấp những phương pháp cần thiết để đúng quy trình lệnh từ Visual Studio. Bạn sẽ cần phải cập nhật QueryStatus và Exec các phương pháp như sau để hiển thị lượt truy cập Line ích trong khi mục trình đơn của nó hoặc nút thanh công cụ được nhấp. Sụp đổ công cộng void QueryStatus (string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus tình trạng, ref đối tượng commandText) ( nếu(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone) ( // Đáp ứng chỉ khi tên lệnh là cho mục trình đơn của chúng tôi // hoặc nút thanh công cụ nếu (commandName == "LineCounterAddin.Connect.LineCounterAddin " | | CommandName == "LineCounterAddin.Connect.LineCounterAddinButton ") { // Vô hiệu hoá các nút nếu Line Số lượt truy cập cửa sổ // đã được nhìn thấy nếu (m_toolWin.Visible) ( // Tình trạng thiết lập để hỗ trợ, nhưng không được kích hoạt
  12. trạng thái = (vsCommandStatus) vsCommandStatus.vsCommandStatusSupported; ) khác { // Tình trạng thiết lập để hỗ trợ và kích hoạt trạng thái = (vsCommandStatus) vsCommandStatus.vsCommandStatusSupported | vsCommandStatus.vsCommandStatusEnabled; ) trở về; } } } công cộng void Exec (string commandName, vsCommandExecOption executeOption, ref đối tượng varIn, ref đối tượng varOut, ref bool xử lý) ( xử lý = sai; nếu(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) ( // Đáp ứng chỉ khi tên lệnh là cho mục trình đơn của chúng tôi hay // nút thanh công cụ nếu (commandName == "LineCounterAddin.Connect.LineCounterAddin " | | CommandName == "LineCounterAddin.Connect.LineCounterAddinButton ") { // Chỉ hiển thị các tiện ích trong nếu nó không phải là đã có thể nhìn thấy nếu (m_toolWin! = null & & M_toolWin.Visible == sai) ( m_toolWin.Visible = thật sự; ) xử lý = thật sự; trở về; } } } Với OnConnection Phương pháp được hoàn thành, tiện ích của bạn sẽ được tạo ra trong một cửa sổ công cụ nổi. Việc kiểm soát sử dụng hoàn chỉnh sẽ cho phép bạn để tính toán dòng và đếm số tổng cộng của mỗi dự án trong dung dịch của bạn, cũng như là bản tóm tắt của tất cả các ngành, nghề trong các giải pháp toàn bộ. Bạn có thể tải về mã nguồn ở đầu bài viết này, biên dịch nó, và bắt đầu các dự án thông qua các trình gỡ lỗi để kiểm tra nó ra và kiểm tra kiểm soát dòng chảy như là add-in khởi động. Như bạn thấy, lượng mã đó là cần thiết để tạo ra một add-in là tương đối đơn giản và dễ hiểu. Hãy tiếp tục vào một số chi tiết về cách truy cập vào dòng chính - kiểm soát người sử dụng, về cơ bản - đã được viết.
  13. Sử dụng Custom Icons cho lệnh của bạn Khi bạn tạo một Visual Studio Add-in mà cung cấp một mục trình đơn hoặc nút thanh công cụ, Visual Studio sẽ mặc định các lệnh để sử dụng các biểu tượng mặc định của Microsoft Office. Cụ thể, các biểu tượng được sử dụng sẽ là một khuôn mặt cười màu vàng (biểu tượng chỉ số # 59, để được chính xác). Thông thường, các biểu tượng có sẵn như là một phần của thư viện MSO sẽ không được những gì bạn đang tìm kiếm. Tạo và sử dụng các biểu tượng tuỳ chỉnh cho các lệnh của bạn không phải là đặc biệt khó khăn, nhưng các tài liệu hướng dẫn để làm như vậy là tốt ẩn và không chính xác đơn giản. Bước đầu tiên trong việc thêm các biểu tượng tùy chỉnh của riêng bạn với các lệnh của bạn là thêm một nguồn lực mới để tập tin của bạn thêm vào dự án. Nhấp chuột phải vào LineCounterAddin dự án trong thám hiểm giải pháp, chọn Add, và chọn 'New Item ...' từ trình đơn. Thêm một nguồn lực mới tập tin gọi là ResourceUI.resx. Sau khi bạn đã thêm các nguồn lực tập tin, chọn nó trong các nhà thám hiểm giải pháp và thay đổi bất động sản Xây dựng Hành động 'để' Không '. Chúng tôi sẽ thực hiện chế biến riêng của chúng tôi của tập tin này với đăng-xây dựng sự kiện sau này. Bây giờ chúng ta có một tập tin tài nguyên mới, chúng tôi cần thêm một hình ảnh với nó. Nếu nó không phải là đã được mở, mở tập tin tài nguyên và nhấn vào mũi tên xuống bên cạnh 'Thêm tài nguyên'. Chọn 'Bmp ...' từ trình đơn hình mới của ''. Khi được nhắc đến tên hình ảnh, chỉ cần gọi nó là 1. Tất cả các nguồn tài nguyên hình ảnh đó sẽ được sử dụng bởi Visual Studio được tham chiếu bởi chỉ số của họ và tài
  14. nguyên ID nên giống như chỉ số đó. Cho tiện ích này tại, chúng tôi sẽ chỉ cần một hình ảnh. Một khi hình ảnh được thêm vào, mở nó lên và thay đổi kích cỡ của nó tới 16x16 pixel và độ sâu màu của nó đến 16 màu. Visual Studio sẽ chỉ hiển thị hình ảnh nếu họ có độ sâu màu của 4 hoặc 24, và nó sẽ sử dụng một màu vôi (RGB của 0, 254, 0) là các mặt nạ minh bạch cho 16 ảnh màu. Cái 1.bmp hình ảnh trong Tài nguyên thư mục của LineCounterAddin dự án mà bạn có thể download ở phía trên của trang có chứa một biểu tượng đơn giản cho tiện ích này tại. Một khi bạn đã tạo ra một tập hợp các nguồn lực mới và thêm một hình ảnh, bạn sẽ cần phải thiết lập nó để xây dựng đúng cách. Điều này đặc biệt là nguồn tài nguyên tập tin phải được biên dịch như là một hội đồng vệ tinh. Chúng ta có thể thực hiện việc này với một post-xây dựng sự kiện. Để chỉnh sửa xây dựng sự kiện, bấm chuột phải vào LineCounterAddin dự án trong thám hiểm và chọn giải pháp tài sản. Một công cụ mới sẽ mở ra trong khu vực tài liệu, với một giao diện tab cho bất động sản dự án chỉnh sửa. Tìm tab Sự kiện Xây dựng như trong hình dưới đây. Trong 'Post-xây dựng khu vực trường dòng lệnh, thêm đoạn mã sau đây: Sụp đổ f: cd $ (ProjectDir)
  15. mkdir $ (ProjectDir) $ (OutDir) en-US "$ (DevEnvDir) .. \ .. \ SDK \ v2.0 \ Bin \ Resgen" $ (ProjectDir) ResourceUI.resx "$ (SystemRoot) \ Microsoft.NET \ Framework \ v2.0.50727 \ Al" / embed: $ (ProjectDir) ResourceUI.resources / văn hóa: en-US / out: $ (ProjectDir) $ (OutDir) en-US \ LineCounterAddin.resources.dll del $ (ProjectDir) Resource1.resources Chú ý: Hãy chắc chắn rằng bạn thay đổi dòng đầu tiên, 'f:', Đại diện cho ổ đĩa bạn có các dự án trên. Điều này là quan trọng, vì nếu không lệnh Resgen sẽ không thể tìm thấy các tập tin tham chiếu của ResourceUI.resx tệp. Cũng lưu ý rằng bạn sẽ cần phải có NET 2.0. SDK cài đặt, nếu không lệnh Resgen sẽ không có sẵn. Kịch bản nên thường nếu không làm việc, vì nó được dựa trên macro chứ không phải là đường dẫn cố định. Một khi bạn có post-xây dựng kịch bản tại chỗ, một hội đồng vệ tinh cho các tiện ích của bạn tại cần được biên soạn mỗi khi bạn xây dựng dự án hoặc giải pháp của bạn, và nó sẽ được đặt trong en-US thư mục con của thư mục của bạn xây dựng đầu ra. Khi bạn chạy các dự án, Visual Studio sẽ tham chiếu này lắp ráp vệ tinh để tìm thấy bất kỳ những hình ảnh thanh lệnh. Đếm Lines Bây giờ bạn đã nhìn thấy làm thế nào để tạo ra một add-in có hiển thị một cửa sổ công cụ mới, đó là thời gian để chuyển sang một số mã juicier. Phần lớn các add-in được viết giống như bất kỳ ứng dụng cũ Các hình thức Windows, với một giao diện người sử dụng, xử lý sự kiện và chức năng helper. Những yêu cầu cho các ứng dụng này là khá đơn giản và một vài mẫu thiết kế cơ bản sẽ giúp chúng tôi đáp ứng những yêu cầu: • MỤC ĐÍCH CHÍNH: Hiển thị dòng số thông tin cho mỗi dự án trong các giải pháp nạp. • Tổng số lần hiển thị lớn cho các giải pháp, và tổng số lần cho từng dự án. • Hiển thị số thông tin cho mỗi cá nhân trong tập đếm từng dự án. • Bá tước dòng code, dòng bình luận, dòng trống, và hiển thị tổng số dòng bình luận và mã net /. • Tính chính xác cho các loại đường khác nhau của tập tin mã nguồn như C + + / C #, VB, XML, vv • Cho phép danh sách các tập tin được sắp xếp theo tên, đếm dòng, file extension. • Cho phép danh sách các tập tin được nhóm lại theo kiểu tập tin, dự án, hoặc không được nhóm nào cả. • Hiển thị chế biến tiến bộ trong thời gian tính toán. Hãy để chúng tôi bắt đầu bằng cách cho chúng ta một trong sạch, có cấu trúc tập tin nguồn cho sự kiểm soát của người dùng. Người sử dụng mã nguồn của bạn kiểm soát tập tin cần phải có cấu trúc như sau:
  16. Sụp đổ sử dụng Hệ thống; sử dụng System; sử dụng System.ComponentModel; sử dụng System.Drawing; sử dụng System.Data; sử dụng System.Text; sử dụng System.Windows.Forms; sử dụng System.IO; sử dụng Microsoft.VisualStudio.CommandBars; sử dụng Khả năng mở rộng; sử dụng EnvDTE; sử dụng EnvDTE80; namespace LineCounterAddin ( công cộng một phần lớp LineCounterBrowser: usercontrol ( # khu vực Các lớp lồng nhau // IComparer các lớp học cho phân loại danh sách tập tin # endregion # khu vực Constructor # endregion # khu vực Biến tư nhân DTE2 m_dte; // Tham chiếu đến các đối tượng Visual Studio DTE # endregion # khu vực Tiết /// /// Nhận VS DTE đối tượng /// công cộng DTE2 DTE ( đặt ( m_dte = giá trị; ) ) # endregion # khu vực Xử lý // UI Event Handlers # endregion # khu vực Helpers # khu vực Đếm dòng phương pháp // Đường dây đếm phương pháp cho các đại biểu # endregion # khu vực Quét và Tổng kết phương pháp // Giải pháp quét và số dòng chung tổng hợp
  17. # endregion # endregion } # khu vực Hỗ trợ Kiến trúc // Đại biểu cho dòng Pluggable đếm phương pháp đại biểu void CountLines (LineCountInfo thông tin); /// /// Gói gọn dòng tính tổng chi tiết. /// lớp LineCountDetails ( // Xem mã nguồn tải về để xem chi tiết đầy đủ } /// /// Wraps một dự án và số dòng tổng số chi tiết /// cho rằng dự án. Liệt kê tất cả các file /// trong đó dự án. /// lớp LineCountSummary ( // Xem mã nguồn tải về để xem chi tiết đầy đủ } /// /// Wraps hồ sơ dự án một mã nguồn và dòng /// Số truy cập thông tin cho tập tin đó. Cũng cung cấp chi tiết /// về các loại tập tin biểu tượng và những gì sẽ được hiển thị /// cho các tập tin trong UI. /// lớp LineCountInfo ( // Xem mã nguồn tải về để xem chi tiết đầy đủ } # endregion } Từ mã sơ bộ ở trên, bạn có thể suy ra một số các thủ thuật sẽ được sử dụng để cho phép nhiều loại mã nguồn tập tin sẽ được tính chính xác, và làm thế nào chúng ta sẽ có thể sắp xếp danh sách tập tin trong một số cách. Các cấu trúc hỗ trợ ở dưới cùng giúp đơn giản hoá mã của dữ liệu đóng gói. Xem mã nguồn đầy đủ cho các chi tiết. Trước hết, hãy che cách chúng tôi sẽ cho phép nhiều thuật toán đếm được sử dụng liên tục, mà không yêu cầu xấu xí nếu/khác hoặc công tắc cú pháp. Một tính năng GREAT của ngôn ngữ hiện đại là con trỏ chức năng, mà trong NET được. Cung cấp bởi các đại biểu. Hầu hết thời gian, tôi nghĩ rằng giá trị của các đại biểu là đau đớn bị bỏ qua trong. NET ứng dụng những ngày này. Vì vậy, tôi sẽ cung cấp một ví dụ đơn giản nhưng thanh lịch như thế nào họ có thể làm cho cuộc sống dễ dàng hơn cho các nhà phát triển thông minh. Khái niệm rất đơn giản: tạo một danh sách các ánh xạ giữa các phần mở rộng file và các đại biểu cho dòng-đếm chức năng. Với NET 2.0. Và
  18. Generics, chúng tôi có thể làm điều này rất hiệu quả. Cập nhật mã nguồn trong các địa điểm sau như vậy: Sụp đổ # khu vực Constructor công cộng LoneCounterBrowser () ( // ... // Chuẩn bị đếm thuật toán ánh xạ CountLines countLinesGeneric = mới CountLines (CountLinesGeneric); CountLines countLinesCStyle = mới CountLines (CountLinesCStyle); CountLines countLinesVBStyle = mới CountLines (CountLinesVBStyle); CountLines countLinesXMLStyle = mới CountLines (CountLinesXMLStyle); m_countAlgorithms = mới Từ điển (33); m_countAlgorithms.Add ("*", CountLinesGeneric); m_countAlgorithms.Add (". cs ", CountLinesCStyle); m_countAlgorithms.Add (". vb ", CountLinesVBStyle); m_countAlgorithms.Add ("vj "., CountLinesCStyle); m_countAlgorithms.Add (". js ", CountLinesCStyle); m_countAlgorithms.Add (". cpp ", CountLinesCStyle); m_countAlgorithms.Add ("cc "., CountLinesCStyle); m_countAlgorithms.Add (". cxx ", CountLinesCStyle); m_countAlgorithms.Add ("c "., CountLinesCStyle); m_countAlgorithms.Add (". HPP ", CountLinesCStyle); m_countAlgorithms.Add (". hh ", CountLinesCStyle); m_countAlgorithms.Add (". hxx ", CountLinesCStyle); m_countAlgorithms.Add (". h ", CountLinesCStyle); m_countAlgorithms.Add ("IDL "., CountLinesCStyle); m_countAlgorithms.Add ("odl "., CountLinesCStyle); m_countAlgorithms.Add (". txt ", CountLinesGeneric); m_countAlgorithms.Add ("xml "., CountLinesXMLStyle); m_countAlgorithms.Add ("xsl "., CountLinesXMLStyle); m_countAlgorithms.Add (". XSLT ", CountLinesXMLStyle); m_countAlgorithms.Add ("XSD "., CountLinesXMLStyle); m_countAlgorithms.Add (". config ", CountLinesXMLStyle); m_countAlgorithms.Add (". res ", CountLinesGeneric); m_countAlgorithms.Add (". resx ", CountLinesXMLStyle); m_countAlgorithms.Add (". aspx ", CountLinesXMLStyle); m_countAlgorithms.Add (". ascx ", CountLinesXMLStyle); m_countAlgorithms.Add (". ashx ", CountLinesXMLStyle); m_countAlgorithms.Add (". asmx ", CountLinesXMLStyle); m_countAlgorithms.Add (". asax ", CountLinesXMLStyle); m_countAlgorithms.Add (". htm ", CountLinesXMLStyle); m_countAlgorithms.Add ("html "., CountLinesXMLStyle); m_countAlgorithms.Add (". css ", CountLinesCStyle); m_countAlgorithms.Add ("sql "., CountLinesGeneric); m_countAlgorithms.Add ("cd "., CountLinesGeneric); // ... } # endregion # khu vực Biến
  19. // ... tư nhân Từ điển m_countAlgorithms; # endregion Bây giờ chúng ta đã xác định các bản đồ, chúng ta cần tạo các chức năng thực tế sẽ được gọi. Các chức năng này là rất đơn giản và chỉ cần phải phù hợp với chữ ký được cung cấp bởi những tuyên bố trước đây của đại biểu đại biểu void CountLines (LineCountInfo info). Trong khu vực Đường dây Đếm thức của lớp của bạn, tạo ra bốn tư nhân phương pháp: Sụp đổ tư nhân void CountLinesGeneric (LineCountInfo info) tư nhân void CountLinesCStyle (LineCountInfo info) tư nhân void CountLinesVBStyle (LineCountInfo info) tư nhân void CountLinesXMLStyle (LineCountInfo info) Tất cả bốn của các chức năng này phù hợp với CountLines đại biểu chữ ký và được ánh xạ tới các phần mở rộng tập tin thích hợp với mã chúng tôi thêm vào constructor mặc định. Nó bây giờ là một vấn đề đơn giản đi qua trong chính quyền m_countAlgorithms và kêu gọi các đại biểu đó là trả lại. Trong trường hợp của một KeyNotFoundException, Chúng tôi chỉ sử dụng '*' trọng để có được cú pháp mặc định chung chung. Không xấu xí, không thể quản lý nếu/khác monstrosities hoặc vô tận công tắc phát biểu là để được tìm thấy. Chúng tôi cũng đã làm cho nó có thể gắn thêm thói quen phân tích trong tương lai mà không cần nỗ lực nhiều. Điều này sẽ được thảo luận chi tiết hơn sau này. Các số lượng lớn của tuyến tính và mã tổng hợp được đặt trong phần còn lại của các chức năng helper. Có hai bộ phận để đếm: quét các giải pháp cho các dự án và các tập tin, và tổng kết thực tế. Các phương pháp được liệt kê dưới đây. Để bây giờ, tôi sẽ không đi vào chi tiết về cách thức tất cả các công trình này mã. Tôi sẽ trang trải các chi tiết hoặc sau này trong một bản cập nhật hoặc với một bài viết bổ sung. The trick chính của đếm nhiều loại khác nhau của tập tin nguồn sử dụng từ điển chung chung và đại biểu như được thảo luận ở trên là khía cạnh quan trọng nhất cho bài viết này. Phân loại, sắp xếp, Sorting Khái niệm cuối cùng tôi muốn bao gồm trong bài viết này là phân loại của danh sách tập tin. Tôi thường nhìn thấy. NET yêu cầu các nhà phát triển như thế nào để sắp xếp các mục trong một ListView. Những câu trả lời thường ít khi xa giữa. Theo tôi tin này Số lượt truy cập Line add-in sẽ là một tiện ích rất hữu ích cho nhiều người dân, tôi hy vọng rằng giải thích của tôi về phân loại một ListView được tiếp xúc rộng ở đây. Cuối cùng, khái niệm là thực sự rất đơn giản. Sử dụng phương pháp Tiêu bản mẫu có thể làm cho nó rất dễ dàng để sắp xếp nhiều cột dữ liệu khác nhau theo những cách khác nhau. Để bắt đầu, hãy thêm một trừu tượng lớp đến vùng Nested Lớp học của người sử dụng điều khiển: Sụp đổ
  20. # khu vực Các lớp lồng nhau trừu tượng lớp ListViewItemComparer: System.Collections.IComparer ( công cộng trừu tượng int So sánh (ListViewItem item1, ListViewItem item2); công cộng ListView SortingList; # khu vực IComparer thành viên int System.Collections.IComparer.Compare (đối tượng x, đối tượng y) ( nếu (x là ListViewItem & & y là ListViewItem) ( int diff = So sánh ((ListViewItem) x, (ListViewItem) y); nếu (SortingList.Sorting == SortOrder.Descending) khác *= -1; trở về khác; ) khác { ném mới ArgumentException ("Một hoặc cả hai đối số không phải là đối tượng ListViewItem. "); } } # endregion } Lớp này phục vụ như nhà tóm tắt của "Tiêu bản Phương pháp của chúng tôi." Các mẫu Template Phương pháp đơn giản là cung cấp một phương pháp, phổ biến trên một bộ xương trừu tượng lớp mà defers một số hoặc tất cả các mã thuật toán thực tế để phân lớp. Điều này sẽ đơn giản hóa phân loại của chúng tôi bằng cách cho phép chúng tôi sử dụng một loại duy nhất và một phương pháp duy nhất khi phân loại, nhưng với một thuật toán phân loại khác nhau cho mỗi cột của ListView. Đối với điều này được thể, chúng ta phải thực hiện nhiều hơn các lớp lồng nhau cho từng loại cột để sắp xếp. Để xem chi tiết của mỗi một trong các lớp học, xem mã nguồn đầy đủ. Sau khi chúng tôi có thuật toán phân loại được xác định rõ ràng của chúng tôi, chúng ta cần phải thực hiện một sự kiện xử lý đơn giản cho ListView.ColumnClick sự kiện: Sụp đổ tư nhân int lastSortColumn = -1; // Track cuối cùng nhấp vào cột /// /// Phân loại các ListView do nhấp vào cột, tự động /// đảo ngược thứ tự sắp xếp trên nhấp chuột tiếp theo của /// cùng một cột. /// /// /// Cung cấp các chỉ số của các nhấp cột. tư nhân void lvFileList_ColumnClick (đối tượng người gửi, ColumnClickEventArgs e) (

CÓ THỂ BẠN MUỐN DOWNLOAD

Đồng bộ tài khoản