随笔:65 文章:1 评论:54 引用:1
博客园 首页 发新随笔
发新文章 联系 订阅订阅管理

2011年8月26日



posted @ 2011-08-26 21:49 Cameo 阅读(20) 评论(0) 编辑

2010年6月8日

原文作者:McLean Schofield

原文链接:http://blogs.msdn.com/b/vsto/archive/2010/06/02/fixing-compile-and-run-time-errors-after-retargeting-vsto-projects-to-the-net-framework-4-mclean-schofield.aspx

 

现在Visual Studio 2010已经发布,想要使用.NET Framework 4提供的新功能,你可以升级以前的项目。或者你已经使用Visual Studio 2010发布.NET Framework 3.5的项目,而现在要把项目部署在.NET Framework 4.0上。把老的项目部署在.NET Framework 4.0.运行时,可能会遇到编译和运行时的错误,如何解决这些错误?

 

重定向一个VSTO项目在the .NET Framework 4上是很简单的。如果你是用Visual Studio 2010创建项目,你可以使用操作指南重定向链接。在没装.NET Framework 3.5,如果你是重定向一个项目到Visual Studio 2010.NET Framework 4.0)可以在弹出的升级对话框上,把项目定向到.NET Framework 4.0上。更多的信息,可以参考以往的文章“重定向当项目升级”.

当项目重定向后,你的大部份工作是完成了。你可以开始在项目继续写代码。当然很多项目-任何项目使用了Ribbon designer, OutLook使用form region,Excel/Word项目便用了某些特定的功能如smart tags和方法GetVstoObject/HasVstoObject – 当重定向项目时,你会会获取编译错误,Add-in没法工作。在出现这些情况的时候,你的代码需要一些修改。当碰到这些情况时,你可参照下面MSDN提供的文章来修改你的代码:

 

升级到.NET Framework 4.0Office项目的一些改变。

升级到.NET Framework 4.0时,更新Excel/Word项目。

升级到.NET Framework 4.0, 更新Ribbon 用户定制.

升级到.NET Framework 4.0,Outlook项目更新Form Regions.

 

除了手把把的教,下面的视频教程是几种特殊情况下的项目重定。看下面的链接:

 

         我如何做:重定向.NET Framework 3.5 Outlook Add-in.NET Framework 4.0.

           我如何做:重定向.NET Framework 3.5 Word 2007 Add-in.NET Framework 4.0.

         Visual Studio 2010 升级Outlook客户端程序到.NET Framework 4.0.

 

背景介绍

VSTO 部门执行支持新的.NET Framework 4嵌入Interop类型功能,他们同样修改了特定的VSTO运行时的程序模型的一些功能。例如,嵌入Interop类型只能与接口调用。VSTO运行时在.NET Framework 4更多的支持接口而不是类。这些改变是根据生产代码和开发者写代码的习惯,因此重定一个项目需要手动的更改代码。

 

.NET Framework 4,如果你兴趣多读一些嵌入Interop类型的功能,这些改变是关于Visual Studio 2010 Tools工具和Office运行时。可以参照下面文章.

 

博客文章

     VSTO 2010运行时设计

     介绍VSTO 2010运时组件

   为什么升级.NET Framework 3.54.0.

   利用Visual Studio 2010升级项目

MSDN文章:

    改变Office项目设计重定向.NET Framework 4.0

Visual Studio Tools for Office运行时概述

设计和创建Office解决方案。

posted @ 2010-06-08 15:35 Cameo 阅读(130) 评论(0) 编辑

2008年12月1日

原文作者:andreww

原文链接: http://blogs.msdn.com/andreww/archive/2008/07/25/creating-a-pivottable-programmatically.aspx

     我接收到一封客户的邮件,问我如何创建Excel数据透视表应用程序.Excel对象模型提供了一系列的对象和方法创建数据透视表(PivotTable).可以通过很多种方法创建数据透视表,在此用一种最简单的方法创建数据透视表从外部数据库读取数据.下面我们就开始我们例子.

     我用的SQL数据库是AdventureWorks,数据库下载地址.在解决方案里,首先创建一个数据连接字符串获取视图vSalesPersonSalesByFiscalYears所有的销售记录.代码如下:

Code

     下一步,在Excel Workbook中,添加一个数据缓存(PivotCathe)到数据缓存集合.并且设置它的连接字符串和SQL Command属性,代码如下:

Code

     下一步,添加一个PivotTable对象到worksheet对象中,PivoTable对象的创建是基于前面创建的PivotCathe对象.代码如下:

Code

     下一步,设置PivotTable显示格式,数据列表的提纲模式替代默认的2*2单元格模式.代码如下:

Code

     下一步,设置"SalesTerritory"字段为页查询字段,"FullName"为行查询字段,代码如下:

Code

     下一步,为2004年的销售数据添加一个标题,代码如下:

Code

      最后,运行一下应用程序,显示结果如下图:

备注:下载数据库跟据你本地的SQL版本下载.安装好数据库后.创建一个Offce Excel文档级项目.把上面的步骤的代码依次拷到Sheet1.cs代码中的Sheet1_Startup方法下.完成后,运行应用程序可以得到上面的运行结果.

posted @ 2008-12-01 15:07 Cameo 阅读(1792) 评论(0) 编辑

2008年10月29日

      CLR是围绕类型工作的.所以在此有必要介绍一下CLR支持的两种类型值类型和引用类型.值类型的基类是System.ValueType,引用类型的基类是System.Object.  Framework 类库提供的类型中,大部份是引用类型.而程序的开发过程中经常用的是值类型.值类型可以提高运用程序的性能.如果一个运用程序都使用引用类型.那么这个运程的性能应该是很糟糕.运用程序执行时,值类型在线程堆栈上分配,而引用类型在托管堆中分配.下面举个例子说明值类型和引用类型在运用程序执行过程中的区别.

Code

     以上是一个比较简单的例子,是关于教师和校长的一个应用程序,教师类型中,有获取教龄,工作内容,查找等操作。运用程序执行时。运用程序的进程首先加载CLR,初始化托管堆(Mangaged Heap)和线程堆栈(Stread Stack). JIT 编译器将应用程序集的中间语言代码(IL)转换成本地的CPU指令(Native code),与此同时,CLR确保应用程序所有类型的程序集都被加载到应用程序域中,接着CLR查找程序集的元数据,提取信息为每个类型分配数据结构。Teacher和President类型是引用类型,数据结构在托管堆(Managed Heap)中分配,如下图:

     

解释一下这两个类型,引用类型的每一个对象在托管堆上分配都有两个额外的对象:类型对象指针(Type object pointer)和同步块索引(Sync block index),这两个成员是CLR用来管理对象。静态字段(Static fields)充许类型内定义的静态数据。虚线下面表示,每个类型对象都包含一张方法表,这张方法表是用来保存每个方法的入口点。如当某个对象调用该对象的某个方法时。就是通过这张方法表来查找对应的方法。从上图可以看出President类型对象方法表只有一个方法。而Teacher类型对象的方法表有三个方法。

     CLR确定Main()方法所需要的Teacher和President类型对象创建和Main()方法被编译成本地的CPU指令后。应用程序的主线程,开始执行main()方法。Main()方法执行时,CLR自动初始化两个本地变量,引用类型初始化为null,值类型初始化为0(分配在线程堆栈上),也就是执行代码的21和22行。如下图

当代码执行到23行时,构建President对象,这时托管堆中,新创建了一个President对象指向President 类型对象( 注意:President对象和President类型对象是不一样的).如下图:

 

如上图新创建的President对象和其它所有的对象一样也包含类型对象指针(Type object pointer)和同步块索引(Sync block index),与类型对象有所不同的是这里包含实例化字段来存储任何基类的实例.当president对象创建时,CLR自动初始化president对象的类型对象指针(Type object pointer)指向对应的President类型对象.同时CLR也初始化了同步块索引(Sync block index).CLR将new操作(实例化President对象)返回的内存地址保存在变量t中(在线程堆栈上).

     当执行24行代码,调用Teacher对象的Lookup静态方法,CLR先在Teacher类型对象的方法表上查找Lookup的方法入口点,接着执行Lookup方法。 假设通过Lookup()查找数据库,得到的结果是Jon是学校的校长(President).因此,间接的Lookup方法在托管堆上创建了一个新的President对象,初始化了Jon,同时将返回的内存地址保存在变量t中。注意:这时的返回的内存地址复盖掉上行代码返回的内存地址。也就是说,变量t不再指向第一个president对象,实际上,也没有其它就量去引用第一个President对象,CLR垃圾回收器会首先释放President对象的内存空间。如下图

 

当执行25行代码,CLR在Teacher类型对象的方法表中查找到GetYearsTeached方法入口并执行。这里要说明一下CLR查找的顺序是从子类到基类,这里是从President类型对象方法表开始查找,没找到,再从基类Teacher类型对象方法表中查找到。假设GetYearsTeached方法返回Jon的教龄是10,并将返回的结果保存在线程堆栈上的变量year中,如下图

 

当执行26代码,调用Teacher对象的虚方法GetProcessReport,CLR查找并检查该方法实现类型,这个例子是President类型对象.即通过President类型对象的方法表查找并执行GetProcessRepor方法.下图标出了这三个方法的本地CPU代码在实现类中位置

注意:如果Teacher对象的Lookup方法查找出来Jon只是一个教师而不是校长,那么,构建的t实例是teacher对象.则执行t.GetProcessReport是调用Teacher对象的GetProcessReport方法.从以上这些图可以看出Teacher和President类型对象都包含类型对象指针,那么他们的类型对象指针会指向哪里?当CLR开始在进程中执行时,立即创建一个特殊的System.Type类型对象.President和Teacher类型对象都是System.Type类型对像的实例.所以President和Teacher类型对象指针指向System.Type 类型对象.另外再说一下System.Type类型对象是它本身的一个实例.所以System.Type类型对象指针指向它本身.如下图:

posted @ 2008-10-29 23:15 Cameo 阅读(1258) 评论(5) 编辑

2008年10月21日

使用 Visual Studio Tools for Office 可以创建两种类型的解决方案:文档级自定义项和应用程序级外接程序。它们具有以下配置:

  • 文档级自定义项由附加于 Microsoft Office Word 文档或 Microsoft Office Excel 工作簿的托管代码程序集组成。

  • 应用程序级外接程序由作为 Microsoft Office 应用程序中的外接程序运行的托管代码程序集组成。

 使用Visual Studio Tools for Office 开发的应用程序是基于CLR的托管应用程序,而Office 是基于COM 组件的非托管应用程序.所以在此觉得有必要复习一下托管应用程序在CLR中的执行过程.就举一个最简单的例子吧,代码如下:

Code

下图为执行的流程图

     简单说说执行过程,VS.NET IDE 调用CSC.exe编译器生成EXE程序集.以32位操作系统为例.当执行EXE程序集时,首行创建一个32位的进程,这个进程中的主线程会去调用MSCorEE.dll组件来初始化CLR,MSCorEE.dll位于C:\WINDOWS\system32目录下,用来判断一台机器是否安装.NET Framework.初如化的CLR会去加载EXE程序集,并从函数入口点Main()开始执行程序,CLR为Main方法中调用的Console类型分配一个单独的内部结构,并为每个该类型的每个方法付上地址,以便该方法调用的时候使用,当首次调用WriteLine()方法时,会去调用JIT编译器,JIT编译器从元数据中查找WriteLine方法,把它编译成本地的CPU代码.并修改存储在Console类型中WriteLine的指针,这样子第二次开始调用WriteLine方法可直接执行本地的CPU代码.另外对元数据有点补充,元数据有二张表,一张是类型表,如用来核对编译时的参数类型.另一个是成员表.说明该托管模块有哪些成员.托管应用程序的执行过程就介绍到这边,下面介绍一下Office应用程序的执行过程.

     VSTO创建的两种解决方案,不管是文档级自定义项,还是应用程序级外接程序,部署后都是由office文档和程序集(dll文件)两个部份组成.当打开具体托管代码office文档时,VSTO加载程序将启动VSTO 运行库(Runtime),创建应用程序域并将该应用程序域的策略设置为不信任“我的电脑”区域.接着VSTO 运行库初始化公共语言运行库(CLR)到应用程序域中.被初始化的CLR加载与文档对应的托管程序集.托管程序通过主互操作程序集PIA(适配器)来捕获文档中发生的事件.接下去具体谈谈Office文档调用程序集的过程.

     1.文档级自定义项的体系结构

     1).2007 Microsoft Office system 的自定义项体系结构

 

  

    不管是文档级自定义项,还是应用程序级外接程序,都存在着指针,用来保存关链的托管程序集的地址.在Office2007文档提供了_AssemblyLocation 属性,用来存储部署清单.当用户打开属于 2007 Microsoft Office 自定义项的文档时,应用程序从 _AssemblyLocation读取部署清单.接着从部署清单中读取应用程序清单.来查找最新的文档级自定义项程序集.自定项程序集过主互操作程序集PIA与Office COM组件进行通信.

 

      2).Microsoft Office 2003 的自定义项体系结构

 

 

     在Office2003文档级自义定项中,不同的是用运行时存储控件来保存应用程序清单.当用户打开属于 2003 Microsoft Office 自定义项的文档时,应用程序从运行时存储控件中读取应用程序清单.应用程序清单加载可选的部署清单来查找最新的文档级自义定项程序集.自定项程序集过主互操作程序集PIA与Office COM组件进行通信.

     在此有必要说说VSTO Runtime 3.0和VSTO Runtime 2.0加载组件是不同的.在VSTO Runtime 3.0,应用程序首先加载VSTOEE.dll组件,接着加载VSTOLoader.dll组件来初始化公共语言运行库.而在VSTO Runtime 2.0只提供AddinLoader.dll来初始化公共语言运行库.

 

     2.应用程序级外接程序的体系结构

     1).2007 Microsoft Office system 的外接程序体系结构

 

 

     与文档级自定义项程序相比,应用程序外接程序是通过注册来发现应用程序的.当用户打开属于 2007 Microsoft Office 应用程序外接程序文档时.应用程序读取注册表项,接着读取部署清单.从部署清单中读取应用程序清单来查找最新的外接程序程序集.外接程序程序集通过主互操作程序集(PIA)与Office COM组件通信.

     2).Microsoft Office 2003 的外接程序体系结构

 

 

     与Microsoft Office 2007 的外接程序相比.加载外接程序程序集的过程基本上是一样的.有一点不同的是应用程序清单加载可选择的部署清单来查找最新的外接程序程序集,外接程序程序集通过主互操作程序集(PIA)与Office COM组件通信.

posted @ 2008-10-21 18:12 Cameo 阅读(2537) 评论(7) 编辑

2008年10月7日

posted @ 2008-10-07 10:38 Cameo 阅读(57) 评论(0) 编辑

2008年9月12日

posted @ 2008-09-12 13:49 Cameo 阅读(498) 评论(27) 编辑

2008年8月1日

posted @ 2008-08-01 19:35 Cameo 阅读(100) 评论(0) 编辑

2008年7月28日

posted @ 2008-07-28 19:17 Cameo 阅读(78) 评论(0) 编辑

2008年7月25日

posted @ 2008-07-25 11:29 Cameo 阅读(66) 评论(0) 编辑
CALENDER
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

网名:Cameo Chen
位置:中国 上海
MSN:xinxiu_chen@hotmail.com
昵称:Cameo
园龄:5年2个月
粉丝:1
关注:0

搜索

 
 

常用链接

随笔分类

随笔档案

常用链接

最新评论

阅读排行榜

评论排行榜

推荐排行榜


Powered By: 博客园
模板提供沪江博客