设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 14348|回复: 13

【原创】VSTO-EXCEL-事件触发流程(写给天平大哥)

[复制链接]
发表于 2014-2-25 09:44:39 | 显示全部楼层 |阅读模式
本帖最后由 faunus 于 2014-2-25 10:13 编辑

【缘起】

天平大哥是我们VSTO初级班(一期)的老大哥,
学号:CA-113A-郑树晓
我不知道是否最年长的一位,却也四十开外了。
虽然刚刚开始接触到VSTO开发,
却有着不输年轻人的学习劲头,
为了弄清楚一段代码一个对像的来龙去脉,
常常会研究到深更半夜(体力好啊),
感楷于此依稀看到了我当年的影子。

其实作为初一期的班主任,
我本人并不推荐这样的学习方式,
毕境这个不是初级班需要的内容,
而大把的精力完全可以放在更有价值的项目上。

不论如何天平大哥对知识的渴求仍值得我们大家学习,
作为朋友和老师我仍然被感动了,
为此昨晚花了一小时将天平大哥的问题(如题)列于引用,
望有共同追求与爱好的同学共勉之。



发表于 2014-2-25 10:24:22 | 显示全部楼层

谢谢老师
激动ing,无以言表
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-2-25 09:49:55 | 显示全部楼层
【找代码】

VSTO真心一个好东西,

复杂自己简化你的应用,
VSTO可以看成VBA项目的一个完美包装,
提供了各种强大的功能,
把复杂的内部实现机制给予隐藏,
让你无需操心,甚至让你看不到。


可我们天平大哥偏偏想一探究竟,
一窥VSTO插件的代码最初的调用源于哪里。
好吧,VSTO也不小气,其实也很简简单单,
就在你的眼前,一个小小的隐藏功能。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2014-2-25 10:01:22 | 显示全部楼层
【代码藏身处】

需要研究的文件是两个
文件一:ThisAddIn.cs
文件二:ThisAddIn.Designer.cs

这两个文件其实是一个主体,
源于c#的新特性:分部类,将一个类分割到了两个文件中。
分部类冠以 partial 关键字
文件一中的定义是:
public partial class ThisAddIn
文件二中的定义是:
public sealed partial class ThisAddIn : Microsoft.Office.Tools.AddInBase

而天平大哥真正想了解的内容,便隐藏在了文件一之中。
这里有一个属性很关键,代发了VSTO插件的启动入口:
  1. [Microsoft.VisualStudio.Tools.Applications.Runtime.StartupObjectAttribute(0)]
复制代码

呵呵找到了吧,立即动手吧,加上断点立马调式。
可是,等等,好像没效果啊。
好吧,我告诉你了,还需要动一个小小的手术,
我们需要把以下的属性给去掉,这家伙就是免调式的根源:
  1. [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
复制代码

搬走两座大山后,天平大哥终于可以见到曙光了。
为了让你能够早早上床,算了,我来吧,哈哈。

 楼主| 发表于 2014-2-25 10:02:46 | 显示全部楼层
本帖最后由 faunus 于 2014-2-25 10:06 编辑

【调用过程-1】

@@入口
ThisAddIn(global::Microsoft.Office.Tools.Excel.ApplicationFactory factory, global::System.IServiceProvider serviceProvider)
        //AddInBase==>protected AddInBase(Factory factory, IServiceProvider serviceProvider, string primaryCookie, string identifier);
        : base(factory, serviceProvider, "AddIn", "ThisAddIn")

@@初始:构造函数
ThisAddIn-开始A!
        //Globals.Factory==>private static global::Microsoft.Office.Tools.Excel.ApplicationFactory _factory
        //factory==>global::Microsoft.Office.Tools.Excel.ApplicationFactory factory
        Globals.Factory = factory;
ThisAddIn-结束A!

@@事件:Initialize
Initialize-开始A!
        //调用基类
        base.Initialize();
                //创建Ribbon
                public RibbonTestA(): base(Globals.Factory.GetRibbonFactory())
                        InitializeComponent();
                public RibbonTestB(): base(Globals.Factory.GetRibbonFactory())
                        InitializeComponent();
        //ThisAddIn.Application==>internal Microsoft.Office.Interop.Excel.Application Application;
        //AddInBase==>protected T GetHostItem<T>(Type type, string cookie) where T : class;
        this.Application = this.GetHostItem<Microsoft.Office.Interop.Excel.Application>(typeof(Microsoft.Office.Interop.Excel.Application), "Application");
        //Globals.ThisAddIn==>private static ThisAddIn _ThisAddIn;
        Globals.ThisAddIn = this;
      
        //Enables visual styles for the application.      
        //Application==>public static void EnableVisualStyles();
        global::System.Windows.Forms.Application.EnableVisualStyles();
        //InitializeCachedData
        InitializeCachedData-开始A!
            if ((this.DataHost == null))
            {
                return;
            }
            if (this.DataHost.IsCacheInitialized) {
                this.DataHost.FillCachedData(this);
            }
        InitializeCachedData-结束A!
        //InitializeControls
        InitializeControls-开始A!
                //ThisAddIn.CustomTaskPanes==>internal Microsoft.Office.Tools.CustomTaskPaneCollection CustomTaskPanes;
                //ThisAddIn.Factory==>private static global::Microsoft.Office.Tools.Excel.ApplicationFactory _factory;
                //interface Factory==>CustomTaskPaneCollection CreateCustomTaskPaneCollection(IServiceProvider serviceProvider, IHostItemProvider hostItemProvider, string primaryCookie, string identifier, object containerComponent);
                this.CustomTaskPanes = Globals.Factory.CreateCustomTaskPaneCollection(null, null, "CustomTaskPanes", "CustomTaskPanes", this);
               
                //ThisAddIn.VstoSmartTags==>internal Microsoft.Office.Tools.SmartTagCollection VstoSmartTags;
                //ThisAddIn.Factory==>private static global::Microsoft.Office.Tools.Excel.ApplicationFactory _factory;
                this.VstoSmartTags = Globals.Factory.CreateSmartTagCollection(null, null, "VstoSmartTags", "VstoSmartTags", this);
        InitializeControls-结束A!
        //InitializeComponents
        InitializeComponents-开始A!
                //暂无
        InitializeComponents-结束A!
        InitializeData
        InitializeData-开始A!
                //暂无
        InitializeData-结束A!
Initialize-结束A!

@@事件:InitializeDataBindings
InitializeDataBindings-开始A!
        //BeginInitialization-
        BeginInitialization-开始A!
                //AddInBase==>public virtual void BeginInit();
                this.BeginInit();
                //interface CustomTaskPaneCollection==>void BeginInit();
                this.CustomTaskPanes.BeginInit();
                //interface SmartTagCollection===>void BeginInit();
                this.VstoSmartTags.BeginInit();
        BeginInitialization-结束A!
      
        //BindToData
        BindToData-开始A!
                //暂无
        BindToData-结束A!
      
        //EndInitialization
        EndInitialization-开始A!
                //interface SmartTagCollection==>void EndInit();
                this.VstoSmartTags.EndInit();
                //interface CustomTaskPaneCollection==>void EndInit();
                this.CustomTaskPanes.EndInit();
                //AddInBase==>public virtual void EndInit();
                this.EndInit();
        EndInitialization-结束A!
InitializeDataBindings-结束A!

 楼主| 发表于 2014-2-25 10:06:52 | 显示全部楼层
【调用过程-2】


@@事件:RibbonTest
//partial class RibbonTestA
RibbonTestA_Load-开始A!
//暂无
RibbonTestA_Load-结束A!
//partial class RibbonTestB!!不执行

@@事件:FinishInitialization
FinishInitialization-开始A!
        //InternalStartup
        this.InternalStartup();
                InternalStartup-开始A!
                        this.Startup += new System.EventHandler(ThisAddIn_Startup);
                        this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
                InternalStartup-结束A!
        //OnStartup
        this.OnStartup();
                OnStartup-开始A!
                        base.OnStartup();
                                ThisAddIn_Startup-开始A!
                                        //暂无
                                ThisAddIn_Startup-结束A!
                OnStartup-结束A!
FinishInitialization-结束A!

@@激活向导
@@中间事件
@@事件:OnShutdown/用户退出

OnShutdown-开始A!
        //ThisAddIn==>internal Microsoft.Office.Tools.SmartTagCollection VstoSmartTags;
        //interface IDisposable==>void Dispose();
        this.VstoSmartTags.Dispose();
        //ThisAddIn==>internal Microsoft.Office.Tools.CustomTaskPaneCollection CustomTaskPanes;
        //interface IDisposable==>void Dispose();
        this.CustomTaskPanes.Dispose();
        base.OnShutdown
                ThisAddIn_Shutdown-开始A!
                        //暂无
                ThisAddIn_Shutdown-结束A!
OnShutdown-结束A!

@@完全退出



 楼主| 发表于 2014-2-25 10:20:27 | 显示全部楼层
【不是结束是开始】


大哥,小弟其实是在害你,
从你此会踏上一条不归路。


【VSTO的调用过程,详见此处】
【原创】VSTO加载过程分析
http://www.office-cn.net/thread-117892-1-1.html
发表于 2014-2-25 10:23:57 | 显示全部楼层
传说中的沙发。

评分

参与人数 1经验 +10 收起 理由
faunus + 10 沙发有奖

查看全部评分

点击这里给我发消息

发表于 2014-2-25 10:34:47 | 显示全部楼层
膜拜。大哥给我们做了榜样。感动。帖子的内容极专业精干,是大家学习的榜样。路漫漫兮其修远,吾将上下而求索。共勉。

评分

参与人数 1经验 +10 收起 理由
faunus + 10 赞一个!

查看全部评分

 楼主| 发表于 2014-2-25 10:48:52 | 显示全部楼层
贴子的顺序乱掉了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-3-29 14:09 , Processed in 0.114812 second(s), 41 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表