和我一起學VSTA(Visual Studio Tools for Applications )(五)
前面四章是介紹,我們已經可以成功的通過一個winform程式開啟一個VS他的IDE程式設計視窗進行二次開發,但是對於我們使用來說是遠遠不夠的,對於二次開發來說,最重要的一點是從主程式呼叫二次開發時編寫的方法。
這一篇,我就簡單介紹下如何呼叫VSTAIDE中編寫的方法。
這裡呼叫方法,第一步就是載入VSTA IDE中編寫的程式碼編譯而成的程式集(dll檔案)到Microsoft.VisualStudio.Tools.Applications.AddIn和Contex中,第二步將準備呼叫的方法名稱傳給MethodInfo,通過反射呼叫實際方法,第三步不再需要使用的時候解除安裝程式集。
下面用程式碼進行講解。
首先在VSTASAMPLE工程裡新增一個RunManagement.cs,程式碼如下:
在VSTAHelper.cs的VSTAHelper類中,新增如下程式碼:這一篇,我就簡單介紹下如何呼叫VSTAIDE中編寫的方法。
這裡呼叫方法,第一步就是載入VSTA IDE中編寫的程式碼編譯而成的程式集(dll檔案)到Microsoft.VisualStudio.Tools.Applications.AddIn和Contex中,第二步將準備呼叫的方法名稱傳給MethodInfo,通過反射呼叫實際方法,第三步不再需要使用的時候解除安裝程式集。
下面用程式碼進行講解。
首先在VSTASAMPLE工程裡新增一個RunManagement.cs,程式碼如下:
1using System;
2using System.Collections.Generic;
3using System.Text;
4using Microsoft.VisualStudio.Tools.Applications;
5using Microsoft.VisualStudio.Tools.Applications.Contract;
6using System.AddIn.Contract.Automation;
7using System.Reflection;
8
9namespace VSTASample
10{
11 ///
12 /// 執行態操作類
13 ///
14 internal class RunManagement
15 {
16 private VSTAApplication application;
17 private Context macroContext;
18 private AddInCollection addInCollection;
19 private IHostItemProviderContract itemProvider;
20 private TypeInfrastructureManager typeInfrastructureManager;
21 private IEntryPointContract[] hostItems;
22 private string hostID;
23 private string templateName;
24
25 private IRemoteObjectContract remoteObjectContract;
26 private RemoteObject remoteObject;
27
28
29 ///
30 /// 初始化RunManagement類的新例項。
31 ///
32 internal RunManagement()
33 {
34 InitializeTypeInfrastructureManager();
35 }
36
37 internal void Connect( VSTAApplication application, string hostID, string templateName )
38 {
39 this.application = application;
40 this.application.RunManagement = this;
41 this.hostID = hostID;
42 this.templateName = templateName;
43
44 this.itemProvider = new HostItemProvider(application, TypeInfrastructureManager);
45 }
46
47 執行態 Managerment
154
155 Internal Properties
165
166 private void InitializeTypeInfrastructureManager()
167 {
168 if(typeInfrastructureManager == null)
169 {
170 typeInfrastructureManager = new TypeInfrastructureManager();
171
172 // This was auto-generated from ProxyGen with the /h:hostmapfile commandline argument.
173
174 global::System.Type hostType;
175 global::System.Type proxyType;
176
177
178 hostType = typeof(global::VSTASample.VSTAApplication);
179 proxyType = typeof(NonProxiableType<global::VSTASample.VSTAApplication>);
180 typeInfrastructureManager.CanonicalNameToTypeMap.Add("VSTASample, VSTASample.VSTAApplication", proxyType);
181 typeInfrastructureManager.TypeToCanonicalNa垃圾廣告p.Add(hostType, "VSTASample, VSTASample.VSTAApplication");
182 }
183 }
184 }
185}
2using System.Collections.Generic;
3using System.Text;
4using Microsoft.VisualStudio.Tools.Applications;
5using Microsoft.VisualStudio.Tools.Applications.Contract;
6using System.AddIn.Contract.Automation;
7using System.Reflection;
8
9namespace VSTASample
10{
11 ///
12 /// 執行態操作類
13 ///
14 internal class RunManagement
15 {
16 private VSTAApplication application;
17 private Context macroContext;
18 private AddInCollection addInCollection;
19 private IHostItemProviderContract itemProvider;
20 private TypeInfrastructureManager typeInfrastructureManager;
21 private IEntryPointContract[] hostItems;
22 private string hostID;
23 private string templateName;
24
25 private IRemoteObjectContract remoteObjectContract;
26 private RemoteObject remoteObject;
27
28
29 ///
30 /// 初始化RunManagement類的新例項。
31 ///
32 internal RunManagement()
33 {
34 InitializeTypeInfrastructureManager();
35 }
36
37 internal void Connect( VSTAApplication application, string hostID, string templateName )
38 {
39 this.application = application;
40 this.application.RunManagement = this;
41 this.hostID = hostID;
42 this.templateName = templateName;
43
44 this.itemProvider = new HostItemProvider(application, TypeInfrastructureManager);
45 }
46
47 執行態 Managerment
154
155 Internal Properties
165
166 private void InitializeTypeInfrastructureManager()
167 {
168 if(typeInfrastructureManager == null)
169 {
170 typeInfrastructureManager = new TypeInfrastructureManager();
171
172 // This was auto-generated from ProxyGen with the /h:hostmapfile commandline argument.
173
174 global::System.Type hostType;
175 global::System.Type proxyType;
176
177
178 hostType = typeof(global::VSTASample.VSTAApplication);
179 proxyType = typeof(NonProxiableType<global::VSTASample.VSTAApplication>);
180 typeInfrastructureManager.CanonicalNameToTypeMap.Add("VSTASample, VSTASample.VSTAApplication", proxyType);
181 typeInfrastructureManager.TypeToCanonicalNa垃圾廣告p.Add(hostType, "VSTASample, VSTASample.VSTAApplication");
182 }
183 }
184 }
185}
1///
2 /// 載入指令碼
3 ///
4 /// 指令碼dll所在目錄(如:C:\ShapeAppSamples\MyVSTADLLTest\Macros\bin)
5 /// 指令碼dll名稱(*.dll)
6 ///
7 /// private VSTAHelper vstaHelper = new VSTAHelper();
8 /// vstaHelper.LoadAddIns(@"..\bin","Demo.dll");
9 ///
10 public void LoadAddIns( string macroFilePath, string macroFileName )
11 {
12 app.RunManagement.LoadAddIns(macroFilePath, macroFileName);
13 }
14
15 ///
16 /// 解除安裝指令碼
17 ///
18 ///
19 /// private VSTAHelper vstaHelper = new VSTAHelper();
20 /// vstaHelper.UnloadAddIns();
21 ///
22 public void UnloadAddIns()
23 {
24 app.RunManagement.UnloadAddIns();
25 }
26
27 ///
28 /// 執行VSTA IDE中的方法
29 ///
30 /// 需執行的方法名
31 ///
32 ///
33 /// private VSTAHelper vstaHelper = new VSTAHelper();
34 /// vstaHelper.LoadAddIns(@"..\bin","Demo.dll");
35 /// vstaHelper.ExecuteMacro("btn1_Click")
36 ///
37 ///
38 public void ExecuteMacro( string macroName )
39 {
40 app.RunManagement.ExecuteMacro(macroName);
41 }
繼續在VSTAApplication類中新增如下程式碼:2 /// 載入指令碼
3 ///
4 /// 指令碼dll所在目錄(如:C:\ShapeAppSamples\MyVSTADLLTest\Macros\bin)
5 /// 指令碼dll名稱(*.dll)
6 ///
7 /// private VSTAHelper vstaHelper = new VSTAHelper();
8 /// vstaHelper.LoadAddIns(@"..\bin","Demo.dll");
9 ///
10 public void LoadAddIns( string macroFilePath, string macroFileName )
11 {
12 app.RunManagement.LoadAddIns(macroFilePath, macroFileName);
13 }
14
15 ///
16 /// 解除安裝指令碼
17 ///
18 ///
19 /// private VSTAHelper vstaHelper = new VSTAHelper();
20 /// vstaHelper.UnloadAddIns();
21 ///
22 public void UnloadAddIns()
23 {
24 app.RunManagement.UnloadAddIns();
25 }
26
27 ///
28 /// 執行VSTA IDE中的方法
29 ///
30 /// 需執行的方法名
31 ///
32 ///
33 /// private VSTAHelper vstaHelper = new VSTAHelper();
34 /// vstaHelper.LoadAddIns(@"..\bin","Demo.dll");
35 /// vstaHelper.ExecuteMacro("btn1_Click")
36 ///
37 ///
38 public void ExecuteMacro( string macroName )
39 {
40 app.RunManagement.ExecuteMacro(macroName);
41 }
1private RunManagement runManagement;
2 ///
3 /// 操作方法類
4 ///
5 public RunManagement RunManagement
6 {
7 get
8 {
9 if(this.runManagement == null)
10 {
11 runManagement = new RunManagement();
12 runManagement.Connect(this, "VSTAHelper", "dlladdin.zip");
13 }
14 return runManagement;
15 }
16 set
17 {
18 runManagement = value;
19 }
20 }
在Form1窗體中新增一個按鈕,並新增click事件,程式碼如下:2 ///
3 /// 操作方法類
4 ///
5 public RunManagement RunManagement
6 {
7 get
8 {
9 if(this.runManagement == null)
10 {
11 runManagement = new RunManagement();
12 runManagement.Connect(this, "VSTAHelper", "dlladdin.zip");
13 }
14 return runManagement;
15 }
16 set
17 {
18 runManagement = value;
19 }
20 }
1VSTASample.VSTAHelper.Instance.LoadAddIns(@"C:\ShapeAppSamples\VSTASample\VSTASample\bin\macro\bin", "Sample.dll");
2VSTASample.VSTAHelper.Instance.ExecuteMacro("fun1");
執行程式,開啟VSTA IDE,在Helper.vb中新增程式碼:2VSTASample.VSTAHelper.Instance.ExecuteMacro("fun1");
1Public Function fun1()
2 MsgBox("HelloWorld!")
3End Function
編譯後,在主程式窗體中點選新增的按鈕,呼叫VB程式,彈出對話方塊,內容為“HelloWorld!”2 MsgBox("HelloWorld!")
3End Function
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-612009/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python Tools for Visual Studio 2.0新功能Python
- 和我一起學Windows Workflow Foundation(微軟工作流)Windows微軟軟工
- 在Visual Studio 中使用git——檔案管理-中(五)Git
- 和我一起理解js中的事件物件JS事件物件
- 和我一起讀Java8 ArrayList原始碼Java原始碼
- Visual Studio Code
- 使用 Visual Studio 2005 Tools for Office 為 .NET 重新設計 Excel VBA 解決方案Excel
- 微軟Visual Studio 2012第五次升級微軟
- 和我一起讀Java8 LinkedList原始碼Java原始碼
- Microsoft Visual Studio CodeROS
- 安裝 Visual Studio
- Visual Studio Tips
- 2020年uniapp學習手記-基礎篇,和我一起學uniappAPP
- visual studio 2005 學習日記 (1)
- visual studio 2005 學習日記 (2)
- 微軟良心:Visual Studio 2012 第五次升級微軟
- 如何手動下載並安裝 Visual Studio Code 的 SAP Fiori tools - Extension Pack 擴充套件套件
- Visual Studio - Now with Go support,你會用 Visual Studio來寫go嗎?Go
- ASP.NET Core MVC 和 Visual Studio入門(五) 使用 SQL Server LocalDBASP.NETMVCSQLServer
- 使用Visual Studio分析dump
- 【Python】—{Visual Studio Code}Python
- Visual Studio for Mac 簡介Mac
- C語言(Visual Studio)C語言
- Visual Studio 常用快捷鍵
- 在Visual Studio 中使用git——給Visual Studio安裝 git外掛(二)Git
- Visual Studio 2005:在組織內部採用 Visual Studio ExpressExpress
- 一起學習SSM框架之SpringMVC(五)SSM框架SpringMVC
- Visual Studio Code 使用筆記筆記
- Visual Studio Code 使用指南
- Visual Studio Code 1.78 釋出!
- Java on Visual Studio Code的更新Java
- visual studio golang環境配置Golang
- Visual Studio Code 使用心得
- Microsoft開源Visual Studio TestROS
- Visual Studio C++ Project 配置C++Project
- Visual Studio的LUA外掛
- Visual Studio 2013 prerequisitesUI
- 論Visual Studio和.NET FrameworkFramework