如何开发和部署outlook2013插件开发 2010插件

君,已阅读到文档的结尾了呢~~
如何开发和部署Outlook 2010插件(Add-in)
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
如何开发和部署Outlook 2010插件(Add-in)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口10496人阅读
Outlook 插件开发小结
  最近实习在做outlook插件开发,阅读了一些VSTO的相关概念和知识。遂将整理所得与大家分享和交流。PS:这篇博客为本人的第一篇正式技术博客,如有错误和不妥之处请读者见谅。
 I.基本介绍
  1.VSTO外接程序体系结构
&&&&&&&&&&&&&
  2.Outlook add-in注册表项
&   1.Microsoft Office 2010 应用程序可加载在 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 下注册的外接程序。默认情况下,2007 Microsoft Office system 中的应用程序只能加载在 HKEY_CURRENT_USER 下注册的外接程序。
&   2.外接程序注册表项位于所有应用程序(Visio 除外,它的 根 为 HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)的以下注册表项之下:Root\Software\Microsoft\Office\应用程序名称\Addins\外接程序ID(外接程序ID一般为项目名)
&   3.Outlook 窗体区域的注册表项:Root\Software\Microsoft\Office\Outlook\FormRegions\消息类
  3.安装部署
&   1. ClickOnce 部署:仅当前用户可以注册外接程序。这是因为 ClickOnce 只支持在 HKEY_CURRENT_USER 下创建密钥。
&   2. Windows Installer部署:无限制
  4.定制项
&  UI方面
&  1.自定义UI
&  2.窗体区域/ribbon:与outlook界面相整合
&  逻辑方面
&  1.与outlook PIA或其他office PIA进行交互
&  2.自定义属性:用于用户自定义数据和扩展功能
  5.outlook对象模型
&  Application 对象
&  Application 对象表示 Outlook 应用程序,它是 Outlook 对象模型中最高级的对象。
&  Explorer 对象
&  Explorer 对象表示显示包含项(如电子邮件、任务或约会)的文件夹内容的窗口。Explorer 对象包括可用来修改窗口的方法和属性,以及窗口更改时所引发的事件。
&  Inspector 对象
&  Inspector 对象表示显示单个项(如电子邮件、任务或约会)的窗口。Inspector 对象包括可用来修改窗口的方法和属性,以及窗口更改时所引发的事件。
&  MAPIFolder 对象
&  MAPIFolder 对象表示包含电子邮件、联系人、任务及其他项的文件夹。Outlook 提供 16 个默认 MAPIFolder 对象。
&  MailItem、AppointmentItem、TaskItem、ContactItem分别对应邮件项、约会项、任务项、联系人项
  6.卸载
&   1.手动删除(控制面板\程序\卸载程序)
&&  2.删除注册表(其实并未完整卸载,只是outlook不能检测到。控制面板\程序中仍有该插件信息)
&&  3.禁用插件(推荐:使outlook将插件禁用,但保留在加载项栏中。想重用时可以手动启用。)
&   后两项都能用代码完成。
 II.实例讲解
  以下demo在VS 2010下完成。
  1.VS 为office拓展程序开发提供了很好的开发项。创建OutlookAddIn:File-&New-&Project-&Visual C#-&Office-&)-&Outlook 2010 Add-in.
  2.命名好工程名确认后,系统会自动生成ThisAddIn类以及一些相应的事件。而ThisAddIn类就是整个拓展程序的一个抽象表示。
  3.现在,我们可以添加自己的定制项。这里我首先添加一个窗体区域(FormRegion),窗体区域的特点是可以将该区域嵌入到outlook的工作区。右击工程名-&Add-&New Item-&Outlook Form Region.点击确认后会进入FormRegion的导航设置  框。分别有一下几项:
    一.创建方式:创建新窗体区域/从已有窗体区域导入(这里选择前者)
    二.窗体样式:按窗体位置和区域分有四种样式(这里选择第二项:adjoining加在工作窗体的底部)
    三.添加描述和呈现喜好(这里选择默认)
    四.选择呈现该窗体区域的消息类。由于我们是要做一个简单的联系人的拓展程序(下面会介绍),所以我们呈现该窗体区域的消息类选择Contact。
  设置完成点击Finish窗体区域就会成功添加。这时会出现一个自定义控件,我们可以设置里面的控件和样式。
  现在介绍一下我们的拓展程序。这里我们是做一个跟联系人有关的拓展程序:为联系人添加附加属性。我们知道联系人默认的属性是有限的,为了方便用户自定义属性,Outlook为我们设置了UserProperties方便用户设置各种自定义属性。这里我们就要  用它设置我们的定制项。这里我们帮联系人添加父母及其生日的附加属性。为简单起见我们需要两个textBox和两个DataTimePicker。布局完成如下:
  4.接下来,我们需要处理拓展程序的逻辑部分。主要思路是定义自定义属性、绑定属性、属性变更处理。主要代码及注释如下:
// 自定义的属性名字
private const string PROPERTY_NAME_MOTHER_NAME = &PROPERTY NAME MOTHER NAME&;
private const string PROPERTY_NAME_MOTHER_BIRTHDAY = &PROPERTY NAME MOTHER BIRTHDAY&;
private const string PROPERTY_NAME_FATHER_NAME = &PROPERTY NAME FATHER NAME&;
private const string PROPERTY_NAME_FATHER_BIRTHDAY = &PROPERTY NAME FATHER BIRTHDAY&;
// 自定义属性对象
private Outlook.UserProperty _MotherNameProperty = null;
private Outlook.UserProperty _MotherBirthdayProperty = null; 10
private Outlook.UserProperty _FatherNameProperty = null; 11
private Outlook.UserProperty _FatherBirthdayProperty = null; 12
// 对应的Contact对象 14
public Outlook.ContactItem _Contact = null; 15
// 标记是否内容修改 17
private bool _Changed = false; 18
// Occurs before the form region is displayed. 20
// Use this.OutlookItem to get a reference to the current Outlook item. 21
// Use this.OutlookFormRegion to get a reference to the form region. 22
private void FormRegion1_FormRegionShowing(object sender, System.EventArgs e) 23
// 获得FormRegion所对应的Contact对象 25
_Contact = ((Microsoft.Office.Tools.Outlook.FormRegionControl)sender).OutlookItem as Outlook.ContactI 26
//_Contact = Globals.ThisAddIn.Application.ActiveInspector().CurrentI 27
// 从联系人的自定义属性中,获得母亲姓名属性 29
_MotherNameProperty = _Contact.UserProperties.Find(PROPERTY_NAME_MOTHER_NAME, Type.Missing); 30
if (_MotherNameProperty != null) 31
// 如果存在这个属性,则取出Value为控件赋值 33
tbMotherName.Text = _MotherNameProperty.Value as S 34
// 不存在则创建这个属性 38
_MotherNameProperty = _Contact.UserProperties.Add(PROPERTY_NAME_MOTHER_NAME, Outlook.OlUserPropertyType.olText, Type.Missing, Type.Missing); 39
// 母亲生日,原理相同 42
_MotherBirthdayProperty = _Contact.UserProperties.Find(PROPERTY_NAME_MOTHER_BIRTHDAY, Type.Missing); 43
if (_MotherBirthdayProperty != null) 44
dtpMotherBirthday.Value = (DateTime)_MotherBirthdayProperty.V 46
_MotherBirthdayProperty = _Contact.UserProperties.Add(PROPERTY_NAME_MOTHER_BIRTHDAY, Outlook.OlUserPropertyType.olDateTime, Type.Missing, Type.Missing); 50
// 父亲姓名 53
_FatherNameProperty = _Contact.UserProperties.Find(PROPERTY_NAME_FATHER_NAME, Type.Missing); 54
if (_FatherNameProperty != null) 55
tbFatherName.Text = _FatherNameProperty.Value as S 57
_FatherNameProperty = _Contact.UserProperties.Add(PROPERTY_NAME_FATHER_NAME, Outlook.OlUserPropertyType.olText, Type.Missing, Type.Missing); 61
// 父亲生日 64
_FatherBirthdayProperty = _Contact.UserProperties.Find(PROPERTY_NAME_FATHER_BIRTHDAY, Type.Missing); 65
if (_FatherBirthdayProperty != null) 66
dtpFatherBirthday.Value = (DateTime)_FatherBirthdayProperty.V 68
_FatherBirthdayProperty = _Contact.UserProperties.Add(PROPERTY_NAME_FATHER_BIRTHDAY, Outlook.OlUserPropertyType.olDateTime, Type.Missing, Type.Missing); 72
// 将这四个控件绑定change事件,只有在修改之后,我们才会将值回写到Contact对应的属性中去 75
tbMotherName.TextChanged += new EventHandler(content_Changed); 76
dtpMotherBirthday.ValueChanged += new EventHandler(content_Changed); 77
tbFatherName.TextChanged += new EventHandler(content_Changed); 78
dtpFatherBirthday.ValueChanged += new EventHandler(content_Changed); 79
// 在Write事件中,把修改的值保存到属性中去 81
_Contact.Write += new Microsoft.Office.Interop.Outlook.ItemEvents_10_WriteEventHandler(contact_Write); 82
void content_Changed(object sender, EventArgs e) 85
// 有修改时,将_Change置为true 87
_Changed = true; 88
void contact_Write(ref bool Cancel) 91
if (_Changed) 93
// 保存值到属性中去 95
_MotherNameProperty.Value = tbMotherName.Text.Trim(); 96
_MotherBirthdayProperty.Value = dtpMotherBirthday.V 97
_FatherNameProperty.Value = tbFatherName.Text.Trim(); 98
_FatherBirthdayProperty.Value = dtpFatherBirthday.V 99
// Occurs when the form region is closed.104
// Use this.OutlookItem to get a reference to the current Outlook item.105
// Use this.OutlookFormRegion to get a reference to the form region.106
private void FormRegion1_FormRegionClosed(object sender, System.EventArgs e)107
// 关闭事件绑定109
_Contact.Write -= new Microsoft.Office.Interop.Outlook.ItemEvents_10_WriteEventHandler(contact_Write);110 111
// 释放对象112
System.Runtime.InteropServices.Marshal.ReleaseComObject(_Contact);113
_Contact = null;114
  现在,拓展程序已经可以调试了。运行后outlook程序会自动启动并加载此拓展项。打开联系人信息工作区会看到刚才的窗体区域被成功地加了进去。
  好了。我们联系人的自定义属性已经做好了。为了实例的完整性,现在我们再加一个ribbon控件,使其附加在本地outlook的ribbon菜单项内。其功能为:一.显示联系人信息(主要是我们刚才添加的附加属性信息);二.拓展程序卸载/禁用。
  5添加ribbon:右击工程名-&Add-&New Item-&Ribbon (Visual Designer).点击确认后会看到一个ribbon控件被添加了进来。值得注意的是RibbonType属性,它决定着ribbon的显示位置默认为Mail.Read。由于我们要将该ribbon显示在主窗体的  ribbon项集中,因此其RibbonType应勾选Explore(同理如何想让该ribbon显示在联系人窗体的ribbon项中可勾选Contact)。现在我们要为其添加两个RibbonButton:分别为Show
Contacts Info和Unistall。
  6.针对Show Contacts Info为了显示联系人信息,我们需要添加一个窗体来进行显示。于是我们可以添加一个UserControl名为ContactsInfoDisplay,其形式如下:
  为了显示联系人信息,我们可以传入一个ContactItem作为其构造函数的参数。然后获取其对象中的相关属性。代码如下: 
1 public ContactsInfoDisplay(Microsoft.Office.Interop.Outlook.ContactItem contact) 2
InitializeComponent(); 4
this.name.Text = contact.LastName+& &+contact.FirstN 5
this.phone.Text = contact.MobileTelephoneN 6
this.email.Text = contact.Email1A 7
//获取自定义属性 8
this.father.Text = string.Format(&{0}({1})&, contact.UserProperties.Find(&PROPERTY NAME FATHER NAME&).Value, contact.UserProperties.Find(&PROPERTY NAME FATHER BIRTHDAY&).Value); 9
this.mother.Text = string.Format(&{0}({1})&, contact.UserProperties.Find(&PROPERTY NAME MOTHER NAME&).Value, contact.UserProperties.Find(&PROPERTY NAME MOTHER BIRTHDAY&).Value);10
  7.针对Unistall,我们有两种策略(第一部分提到)。
&&&&&&&& 一:删除注册表:第一部分提到过outlook加载插件时先检查注册表里的特定目录下的项。如果删除该项,outlook就不会检测到从而也就不会加载。代码如下:
1 RegistryKey regKey = null; 2
RegistryKey regSubKey = null; 3
//Read the key
regKey = Microsoft.Win32.Registry.CurrentU 7
//获取outlook插件目录下的子键 8
regSubKey = regKey.OpenSubKey(string.Format(@&Software\Microsoft\Office\Outlook\Addins&), true); 9
//获取当前插件名10
regSubKey.DeleteSubKey(Assembly.GetExecutingAssembly().GetName().Name);11
System.Windows.Forms.MessageBox.Show(&插件卸载成功,下次启动生效!&);12
catch (Exception e)14
System.Windows.Forms.MessageBox.Show(e.Message);16
   二:禁用插件:由于第一种方法只是处理注册表,因此卸载的不是很彻底。还有很多遗留项。因此推荐使用第二种方法。使outlook将插件禁用,但保留在加载项栏中。想重用时可以手动启用。其相应的代码也很简单。
Microsoft.AddIn addin= Globals.AddIns.Item(&OutlookAddInDemo&);2
addin.Connect = false;
  到现在我们的实例已经完整的介绍完了,运行结果如图。完整工程源代码下载:。
来自:-插件开发小结/
QQ 交流群:6休
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:409976次
积分:4479
积分:4479
排名:第4459名
原创:25篇
转载:185篇
评论:16条
(2)(1)(1)(1)(1)(1)(1)(6)(1)(1)(2)(2)(4)(5)(7)(5)(6)(3)(9)(8)(3)(1)(7)(1)(20)(14)(27)(4)(12)(2)(2)(6)(10)(12)(11)(2)(4)(1)(2)(1)(1)[随笔分类]MOSS 2010:Visual Studio 2010开发体验(35)
[网站分类]VS2010(16)
[随笔分类]Office & SharePoint 及其开发(75)
通过前面几篇,我们已经完成了内容类型,列表定义,列表实例的开发。本篇继续讲解列表中的一个重要环节——事件接收器开发。 我们的场景是:我希望之前做好的订单列表这个内容类型自动地具有某些事件特征,例如当用户在添加一个条目的时候,检查订购日期,如果小于今天的话,就不让添加。(这只是一个假设的场景,现实工作中可以依照业务逻辑而定) 我们应该如何实现这个需求呢?Follow me
1.添加一个事件接收器
下面是默认生成的两个文件
OrderItemEventReceiverItemAdding
ItemAdding
$SharePoint.Project.AssemblyFullName$
OrderListSolution.OrderItemEventReceiver.OrderItemEventReceiver
2. 修改有关代码实现业务逻辑using S
using System.Security.P
using Microsoft.ShareP
using Microsoft.SharePoint.S
using Microsoft.SharePoint.U
using Microsoft.SharePoint.W
namespace OrderListSolution.OrderItemEventReceiver
/// List Item Events
public class OrderItemEventReceiver : SPItemEventReceiver
/// An item is being added.
public override void ItemAdding(SPItemEventProperties properties)
SPItemEventDataCollection data = properties.AfterP
SPList list = properties.OpenWeb().Lists[properties.ListId];
string fieldName= list.Fields.GetField("订购日").InternalN
var date = DateTime.Parse(data[fieldName].ToString());
if (date > DateTime.Now)
properties.ErrorMessage = "当前添加的日期不合法";
properties.Cancel = true;
3.部署和调试,按下F5键
【注意】我们这里故意将订购日设置于大于当前日期。根据事件中的逻辑,我们预期它会报告一个错误,而且取消当前的提交
我们看到了这个错误页面,看起来有些吓人,不是吗?对于一般用户来说,他们可能要被吓坏了
接下来,我们可以定义一个专门的页面来显示错误消息,提高用户体验
然后修改一下代码using S
using System.Security.P
using Microsoft.ShareP
using Microsoft.SharePoint.S
using Microsoft.SharePoint.U
using Microsoft.SharePoint.W
namespace OrderListSolution.OrderItemEventReceiver
/// List Item Events
public class OrderItemEventReceiver : SPItemEventReceiver
/// An item is being added.
public override void ItemAdding(SPItemEventProperties properties)
SPItemEventDataCollection data = properties.AfterP
SPList list = properties.OpenWeb().Lists[properties.ListId];
string fieldName= list.Fields.GetField("订购日").InternalN
var date = DateTime.Parse(data[fieldName].ToString());
if (date > DateTime.Now)
//properties.ErrorMessage = "当前添加的日期不合法";
properties.Status = SPEventReceiverStatus.CancelWithRedirectU
properties.RedirectUrl = "/_layouts/OrderListSolution/ErrorPage.aspx";
properties.Cancel = true;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:685571次
积分:16832
积分:16832
排名:第367名
原创:1019篇
评论:79条
(15)(6)(4)(2)(6)(15)(2)(2)(11)(8)(22)(55)(68)(35)(69)(61)(32)(21)(5)(26)(55)(499)如何开发和部署Outlook 2010插件_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何开发和部署Outlook 2010插件
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩29页未读,继续阅读
你可能喜欢

我要回帖

更多关于 outlook2010搜索插件 的文章

 

随机推荐