和我一起學VSTA(Visual Studio Tools for Applications )(五)

iDotNetSpace發表於2009-08-12

前面四章是介紹,我們已經可以成功的通過一個winform程式開啟一個VS他的IDE程式設計視窗進行二次開發,但是對於我們使用來說是遠遠不夠的,對於二次開發來說,最重要的一點是從主程式呼叫二次開發時編寫的方法。
這一篇,我就簡單介紹下如何呼叫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和我一起學VSTA(Visual Studio Tools for Applications )(五){
 11和我一起學VSTA(Visual Studio Tools for Applications )(五)    /// 
 12    /// 執行態操作類
 13    /// 

 14    internal class RunManagement
 15和我一起學VSTA(Visual Studio Tools for Applications )(五)    {
 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和我一起學VSTA(Visual Studio Tools for Applications )(五)        /// 
 30        /// 初始化RunManagement類的新例項。
 31        /// 

 32        internal RunManagement()
 33和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
 34            InitializeTypeInfrastructureManager();
 35        }

 36
 37        internal void Connect( VSTAApplication application, string hostID, string templateName )
 38和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
 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和我一起學VSTA(Visual Studio Tools for Applications )(五)        執行態 Managerment
154
155和我一起學VSTA(Visual Studio Tools for Applications )(五)        Internal Properties
165
166        private void InitializeTypeInfrastructureManager()
167和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
168            if(typeInfrastructureManager == null)
169和我一起學VSTA(Visual Studio Tools for Applications )(五)            {
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}
在VSTAHelper.cs的VSTAHelper類中,新增如下程式碼:
 1和我一起學VSTA(Visual Studio Tools for Applications )(五)/// 
 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和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
12            app.RunManagement.LoadAddIns(macroFilePath, macroFileName);
13        }

14
15和我一起學VSTA(Visual Studio Tools for Applications )(五)        /// 
16        /// 解除安裝指令碼
17        /// 
18        /// 
19        /// private VSTAHelper vstaHelper = new VSTAHelper();
20        /// vstaHelper.UnloadAddIns();
21        /// 

22        public void UnloadAddIns()
23和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
24            app.RunManagement.UnloadAddIns();
25        }

26
27和我一起學VSTA(Visual Studio Tools for Applications )(五)        /// 
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和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
40            app.RunManagement.ExecuteMacro(macroName);
41        }
繼續在VSTAApplication類中新增如下程式碼:
 1private RunManagement runManagement;
 2和我一起學VSTA(Visual Studio Tools for Applications )(五)        /// 
 3        /// 操作方法類
 4        /// 

 5        public RunManagement RunManagement
 6和我一起學VSTA(Visual Studio Tools for Applications )(五)        {
 7            get
 8和我一起學VSTA(Visual Studio Tools for Applications )(五)            {
 9                if(this.runManagement == null)
10和我一起學VSTA(Visual Studio Tools for Applications )(五)                {
11                    runManagement = new RunManagement();
12                    runManagement.Connect(this"VSTAHelper""dlladdin.zip");
13                }

14                return runManagement;
15            }

16            set
17和我一起學VSTA(Visual Studio Tools for Applications )(五)            {
18                runManagement = value;
19            }

20        }
在Form1窗體中新增一個按鈕,並新增click事件,程式碼如下:
1VSTASample.VSTAHelper.Instance.LoadAddIns(@"C:\ShapeAppSamples\VSTASample\VSTASample\bin\macro\bin""Sample.dll");
2VSTASample.VSTAHelper.Instance.ExecuteMacro("fun1");
執行程式,開啟VSTA IDE,在Helper.vb中新增程式碼:
1和我一起學VSTA(Visual Studio Tools for Applications )(五)Public Function fun1()
2        MsgBox("HelloWorld!")
3End Function
編譯後,在主程式窗體中點選新增的按鈕,呼叫VB程式,彈出對話方塊,內容為“HelloWorld!”

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-612009/,如需轉載,請註明出處,否則將追究法律責任。

相關文章