Tải bản đầy đủ (.doc) (29 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (380.22 KB, 29 trang )

• 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 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.
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.
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;
_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
/// <tóm tắt>
/// Nhận VS DTE đối tượng
/// </tóm tắt>
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 =
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 ",
"Đườ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 đổ
/// <tóm tắt>
/// Thêm một thanh lệnh đến giao diện VS2005.
/// </tóm tắt>
/// <param name = "Tên">Tên của thanh lệnh</param>
/// <param name = "vị trí">Ban lệnh thanh định vị</param>
/// <trở về></trở 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;
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;
)
/// <tóm tắt>
/// Thêm một menu để giao diện VS2005.
/// </tóm tắt>
/// <param name = "Tên">Tên của trình đơn</param>
/// <trở về></trở về>
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;
)
/// <tóm tắt>
/// Thêm một lệnh cho một popup menu trong VS2005.
/// </tóm tắt>
/// <param name = "popup">Popup menu để thêm lệnh vào.</param>
/// <param name = "Tên">Tên của các lệnh mới.</param>
/// <param name = "nhãn">Các nhãn văn bản của lệnh.</param>
/// <param name = "ttip">Tooltip cho các lệnh.</param>
/// <param name = "iconIdx">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.</param>
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
)
)

/ / / <tóm tắt>
/ / / Thêm một lệnh cho một thanh công cụ trong VS2005.
/ / / </tóm tắt>
/// <param tên="thanh ">Thanh để thêm lệnh vào.</param>
/// <param tên="Tên ">Tên của các lệnh mới.</param>
/// <param tên="Nhan ">Các nhãn văn bản của lệnh.</param>
/// <param tên="ttip ">Tooltip cho các lệnh.</param>
/// <param tên="iconIdx ">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.</param>
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;
/ / 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
trạng thái = (vsCommandStatus)
vsCommandStatus.vsCommandStatusSupported;
)
khác
{

×