本文讨论:
VSTO 自定义基础知识
构建
![](/icons/70577yi.gif)
个自定义文档
集成数据源
部署到 SharePo
本文使用了以下技术:
VSTO、SharePo
![](/icons/70577int.gif)
、SQL Server
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/f6add2d7-278d-4767-bb91-95ce19cfa584.g<img src='/icons/70577if.gif' />)
目录
VSTO 自定义基础知识
构建 VSTO 自定义
创建用户Control控件
部署和安全性
新建内容类型
结束语
Office 业务应用
![](/icons/70577chengxu.gif)
(OBA) 是使用组成 Microsoft® 2007 Office 系统
![](/icons/70577de.gif)
服务、工具和服务器构建
![](/icons/70577de.gif)
复合应用
![](/icons/70577chengxu.gif)
![](/icons/70577dou2.gif)
这些应用
![](/icons/70577chengxu.gif)
和业务线 (LOB) 系统(如 SAP、PeopleSoft 和 Microsoft Dynamics)相集成
![](/icons/70577dou2.gif)
OBA
![](/icons/70577de.gif)
主要目标是:弥合员工无法直接访问 LOB 系统中业务数据时所产生
![](/icons/70577de.gif)
沟壑
![](/icons/70577dou.gif)
以此利用对 LOB 系统
![](/icons/70577de.gif)
现有投资
![](/icons/70577dou2.gif)
由于存在这
![](/icons/70577yi.gif)
沟壑
![](/icons/70577dou.gif)
许多员工必须使用过期
![](/icons/70577de.gif)
业务数据
![](/icons/70577dou2.gif)
这可能导致因信息有误而做出
![](/icons/70577cuowu.gif)
![](/icons/70577de.gif)
业务决策
![](/icons/70577dou.gif)
并且为拥有 LOB 系统访问权限
![](/icons/70577de.gif)
人员带来不必要
![](/icons/70577de.gif)
请求
![](/icons/70577dou2.gif)
从而损耗时间
![](/icons/70577dou.gif)
并且更多情况下会产生资金成本
![](/icons/70577dou2.gif)
OBA 还具有其他优点
![](/icons/70577dou.gif)
如将业务数据引入日常工作环境中 — 通常是通过熟悉
![](/icons/70577de.gif)
Microsoft Office 应用
![](/icons/70577chengxu.gif)
来实现
![](/icons/70577dou2.gif)
LOB 系统有时要想全面掌握是颇为困难
![](/icons/70577de.gif)
(这还是婉转
![](/icons/70577de.gif)
说法)
![](/icons/70577dou.gif)
以熟悉
![](/icons/70577de.gif)
工具为构建基础有助于减少相应
![](/icons/70577de.gif)
培训成本
![](/icons/70577dou2.gif)
可使用以下 4个核心部件构建有效
![](/icons/70577de.gif)
OBA:LOB 系统、自定义 Office 客户端应用
![](/icons/70577chengxu.gif)
、Microsoft Office SharePo
![](/icons/70577int.gif)
® Server (MOSS) 2007 以及将其他 3部分结合起来
![](/icons/70577de.gif)
服务
![](/icons/70577dou2.gif)
也可将其他产品(如 Exchange Server 或 Office Communications Server (OCS))绑定到 OBA 中来扩大其范围和功能
![](/icons/70577dou.gif)
Visual Studio® Tools for Office (VSTO) 还提供内置功能来帮助快速构建解决方案
![](/icons/70577dou2.gif)
例如
![](/icons/70577dou.gif)
可创建 Excel® 服务 Web 部件来指向 Excel 2007 电子表格中
![](/icons/70577de.gif)
数据
![](/icons/70577dou.gif)
从而使开发人员可在 SharePo
![](/icons/70577int.gif)
中构建商业智能视图
![](/icons/70577dou2.gif)
或者
![](/icons/70577dou.gif)
通过将 Visual Studio Tools for Office (VSTO) 自定义集成到 SharePo
![](/icons/70577int.gif)
中
![](/icons/70577dou.gif)
这样用户可直接从文档库
![](/icons/70577diaoyong.gif)
自定义模板或文档
![](/icons/70577dou.gif)
从而可提供丰富
![](/icons/70577de.gif)
客户端自定义
![](/icons/70577dou2.gif)
这种特定类型
![](/icons/70577de.gif)
集成具有很多优点
![](/icons/70577dou.gif)
如以 Office 客户端应用
![](/icons/70577chengxu.gif)
功能集为构建基础(因此不必在应用
![](/icons/70577chengxu.gif)
中重新生成此功能集)、有效管理和部署文档或模板
![](/icons/70577chengxu.gif)
集(VSTO 自定义)以及允许在集中存储和管理数据
![](/icons/70577de.gif)
同时能在工作流驱动
![](/icons/70577de.gif)
协作环境中操作数据
![](/icons/70577dou2.gif)
本文将重点介绍提到
![](/icons/70577de.gif)
第 2个和第 3个优点:构建文档级 VSTO 自定义和将其和 SharePo
![](/icons/70577int.gif)
中
![](/icons/70577de.gif)
内容类型相集成
![](/icons/70577dou2.gif)
这两个优点组合起来后
![](/icons/70577dou.gif)
可在客户端上利用 Office 平台丰富
![](/icons/70577de.gif)
用户功能
![](/icons/70577dou.gif)
同时将在客户端上捕获
![](/icons/70577de.gif)
数据无缝扩展到企业
![](/icons/70577dou2.gif)
我将特别为您展示如何创建、部署和保护 VSTO 文档级解决方案(它们使用通过自定义操作窗格绑定到集中管理数据
![](/icons/70577de.gif)
Microsoft Word 内容Control控件)
![](/icons/70577dou2.gif)
然后
![](/icons/70577dou.gif)
我将展示如何在 SharePo
![](/icons/70577int.gif)
中创建内容类型
![](/icons/70577dou.gif)
最后展示如何将内容类型映射到自定义 VSTO 文档级解决方案
![](/icons/70577dou2.gif)
VSTO 自定义基础知识
请注意
![](/icons/70577dou.gif)
可构建两种 VSTO 加载项
![](/icons/70577dou2.gif)
第
![](/icons/70577yi.gif)
个(将在本文中介绍)是文档级解决方案 — 实质上是仅出现在特定文档或模板中
![](/icons/70577de.gif)
自定义
![](/icons/70577dou2.gif)
第 2个(本文没有介绍)是应用
![](/icons/70577chengxu.gif)
级加载项 — 实质上是每次打开宿主应用
![](/icons/70577chengxu.gif)
时会出现
![](/icons/70577de.gif)
自定义
![](/icons/70577dou2.gif)
由于 OBA 常常和流程相关
![](/icons/70577dou.gif)
因此我准备针对 Word 创建
![](/icons/70577yi.gif)
个非常简单
![](/icons/70577de.gif)
VSTO 自定义(它是更广泛
![](/icons/70577de.gif)
采购订单 (PO) 流程
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
个小部件)
![](/icons/70577dou2.gif)
为便于本文讨论
![](/icons/70577dou.gif)
此流程包括 3个关键步骤:针对客户申请
![](/icons/70577de.gif)
工作创建
![](/icons/70577yi.gif)
个 PO、从采购订单生成
![](/icons/70577yi.gif)
个工作介绍说明 (SOW)
![](/icons/70577dou.gif)
以及在完成工作时生成
![](/icons/70577yi.gif)
张发票
![](/icons/70577dou2.gif)
当然
![](/icons/70577dou.gif)
具体
![](/icons/70577de.gif)
PO 流程可能有所区别
![](/icons/70577dou.gif)
但它们都是本文中举例
![](/icons/70577de.gif)
基本组成部分
![](/icons/70577dou2.gif)
在此方案中
![](/icons/70577dou.gif)
还假设公司使用 LOB 系统来集中管理数据(如工作或客户详细信息)
![](/icons/70577dou2.gif)
为便于本文讨论(并为简单起见)
![](/icons/70577dou.gif)
我将使用 SQL Server® 连接;但是
![](/icons/70577dou.gif)
在真正实施中
![](/icons/70577dou.gif)
可使用 Windows® Communication Foundation (WCF) 服务或 Web 服务来连接 LOB 系统
![](/icons/70577dou2.gif)
本文将重点介绍流程中开具发票这
![](/icons/70577yi.gif)
过程
![](/icons/70577dou2.gif)
为此
![](/icons/70577dou.gif)
我将创建
![](/icons/70577yi.gif)
个自定义发票
![](/icons/70577dou.gif)
它使用集中管理
![](/icons/70577de.gif)
数据并且随后和 SharePo
![](/icons/70577int.gif)
相集成
![](/icons/70577dou2.gif)
接着
![](/icons/70577dou.gif)
考虑如何构建和集成流程中
![](/icons/70577de.gif)
其他步骤
![](/icons/70577dou.gif)
并针对 SharePo
![](/icons/70577int.gif)
中
![](/icons/70577de.gif)
自定义发票构建
![](/icons/70577yi.gif)
个工作流
![](/icons/70577dou2.gif)
但是
![](/icons/70577dou.gif)
在开始编码的前
![](/icons/70577dou.gif)
您可能希望使用
![](/icons/70577yi.gif)
个自定义发票文档或模板
![](/icons/70577dou2.gif)
如图 1 所示
![](/icons/70577dou.gif)
我创建了
![](/icons/70577yi.gif)
个非常简单
![](/icons/70577de.gif)
客户发票
![](/icons/70577dou.gif)
它仅具有基本信息
![](/icons/70577dou.gif)
没有太多修饰
![](/icons/70577dou2.gif)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/de8ef9dd-53ab-4976-87f9-e0af7dfc43cf.g<img src='/icons/70577if.gif' />)
图 1客户发票文档
创建文档的后
![](/icons/70577dou.gif)
就可开始有趣
![](/icons/70577de.gif)
工作:构建文档级自定义
![](/icons/70577dou2.gif)
为此
![](/icons/70577dou.gif)
使用 Visual Studio 2008(单击“文件”|“新建”|“项目”)创建
![](/icons/70577yi.gif)
个新
![](/icons/70577de.gif)
Word 2007 文档项目
![](/icons/70577dou2.gif)
然后
![](/icons/70577dou.gif)
在 Visual C#® 或 Visual Basic® 中
![](/icons/70577dou.gif)
单击“Office”|“2007”|“Word 2007 文档”
![](/icons/70577dou2.gif)
在 Visual Studio 创建项目外壳的前
![](/icons/70577dou.gif)
它会提示您为应用
![](/icons/70577chengxu.gif)
选择
![](/icons/70577yi.gif)
个文档
![](/icons/70577dou2.gif)
此时即可将文档(在本举例中为发票)和项目相链接
![](/icons/70577dou2.gif)
可指定
![](/icons/70577yi.gif)
个现有文件(就像我
![](/icons/70577yi.gif)
样)或创建
![](/icons/70577yi.gif)
个新文件
![](/icons/70577dou2.gif)
然后
![](/icons/70577dou.gif)
Visual Studio 会将所有 Word 菜单选项和功能加载到开发环境中
![](/icons/70577dou2.gif)
VSTO 3.0 是 Visual Studio Professional Edition 及更高版本中所包含
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
项技术
![](/icons/70577dou.gif)
可利用此技术使用托管代码为 Office 构建解决方案
![](/icons/70577dou2.gif)
VSTO 文档级解决方案最令我喜欢
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
件事是项目中使用
![](/icons/70577de.gif)
文档或模板非常类似于 Visual Studio 中
![](/icons/70577de.gif)
设计器
![](/icons/70577dou2.gif)
就像使用 Windows 窗体或 Windows Presentation Foundation (WPF) 用户Control控件
![](/icons/70577yi.gif)
样
![](/icons/70577dou.gif)
可从“工具箱”拖动Control控件并将它们放到文档中
![](/icons/70577dou.gif)
甚至是将事件添加到文档中
![](/icons/70577dou2.gif)
Visual Studio 为您创建
![](/icons/70577yi.gif)
个项目外壳
![](/icons/70577dou.gif)
它将自定义文档用作项目
![](/icons/70577de.gif)
核心部件
![](/icons/70577dou2.gif)
通过使用创建
![](/icons/70577de.gif)
项目外壳
![](/icons/70577dou.gif)
我向发票文档添加了两个主要
![](/icons/70577de.gif)
自定义
![](/icons/70577dou.gif)
然后在文档后面添加了
![](/icons/70577yi.gif)
些代码来处理客户数据
![](/icons/70577dou2.gif)
具体来说
![](/icons/70577dou.gif)
我是向文档添加了
![](/icons/70577yi.gif)
些 Word 内容Control控件
![](/icons/70577dou2.gif)
然后
![](/icons/70577dou.gif)
创建
![](/icons/70577yi.gif)
个自定义操作窗格来管理内容Control控件中加载数据
![](/icons/70577de.gif)
视图
![](/icons/70577dou2.gif)
图 2 显示了以设计模式打开文档时
![](/icons/70577de.gif)
项目视图
![](/icons/70577dou2.gif)
在“工具栏”窗格中显示有 Word Control控件 — 可将这些 Word 内容Control控件拖到文档表面
![](/icons/70577dou2.gif)
我已将它们添加到整个文档中
![](/icons/70577dou2.gif)
在图 2 中
![](/icons/70577dou.gif)
文本“Click here to enter text.”指出了我已添加到文档
![](/icons/70577de.gif)
内容Control控件
![](/icons/70577dou2.gif)
对于本项目
![](/icons/70577dou.gif)
我使用
![](/icons/70577de.gif)
是“丰富文本内容Control控件”
![](/icons/70577dou.gif)
可利用它来更加灵活地控制文本显示和格式
![](/icons/70577dou2.gif)
还可添加其他类型
![](/icons/70577de.gif)
Control控件(如图像、日期挑选器或组合框)
![](/icons/70577dou2.gif)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/68d8f3bd-0349-4969-a414-cd158106e87c.g<img src='/icons/70577if.gif' />)
图 2编辑 VSTO 自定义文档
将内容Control控件添加到文档表面后
![](/icons/70577dou.gif)
接下会希望将数据源集成到项目中
![](/icons/70577dou2.gif)
在 OBA 上下文中
![](/icons/70577dou.gif)
这可能意味着将服务集成到项目中
![](/icons/70577dou.gif)
然后让服务中
![](/icons/70577de.gif)
成员能从 LOB 系统读取数据或将数据写入 LOB 系统中
![](/icons/70577dou2.gif)
为简便起见
![](/icons/70577dou.gif)
我将把 SQL Server 数据库用作举例 LOB 系统
![](/icons/70577dou2.gif)
数据源是名为 PODetails
![](/icons/70577de.gif)
表
![](/icons/70577dou.gif)
包括
![](/icons/70577de.gif)
列有 PO ID(主键)、客户名称、地址和联系人、PO 详细信息以及 PO 总金额
![](/icons/70577dou2.gif)
通过使用“Add New Data Source Wizard”(添加新数据源向导)(“Data”(数据)|“Add New Data Source”(添加新数据源)|“New Connection”(新建连接))
![](/icons/70577dou.gif)
即可将 PODetails 数据用于我
![](/icons/70577de.gif)
解决方案
![](/icons/70577dou2.gif)
此向导提示输入集成到项目中
![](/icons/70577de.gif)
表
![](/icons/70577dou.gif)
然后为项目提供
![](/icons/70577yi.gif)
个默认连接
![](/icons/70577zifu.gif)
串
![](/icons/70577dou2.gif)
创建用户Control控件
现在
![](/icons/70577dou.gif)
创建将位于操作窗格内
![](/icons/70577de.gif)
用户Control控件(请参阅图 3)
![](/icons/70577dou2.gif)
此用户Control控件包括 6个具有标签
![](/icons/70577de.gif)
字段和 4个按钮Control控件
![](/icons/70577dou2.gif)
使用数据绑定属性将每个字段绑定到数据库表中
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
个记录
![](/icons/70577dou2.gif)
这些按钮用于将数据从 SQL Server 加载到Control控件中
![](/icons/70577dou.gif)
前后浏览数据以及将选定数据添加到自定义发票文档
![](/icons/70577de.gif)
内容Control控件中
![](/icons/70577dou2.gif)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/8eb5df7d-8bd0-472a-a11e-30a37c4fa9d3.g<img src='/icons/70577if.gif' />)
图 3客户 PO 信息用户Control控件
创建用户Control控件后
![](/icons/70577dou.gif)
向每个按钮Control控件添加事件
![](/icons/70577dou2.gif)
对于加载数据事件
![](/icons/70577dou.gif)
添加以下代码:
CustomerInvoice {
public partial
CustomerDataFilterControl : UserControl {
private void btnLoadPOData_Click(object sender, EventArgs e) {
CustomerInvoice.PODataDataSetTableAdapters.
PurchaseOrderDetailsTableAdapter poAdapter = ![](/icons/70577new.gif)
CustomerInvoice.PODataDataSetTableAdapters.
PurchaseOrderDetailsTableAdapter
;
poAdapter.Fill(this.pODataDataSet.PurchaseOrderDetails);
}
}
}
另
![](/icons/70577yi.gif)
设计为在核心加载项类
![](/icons/70577de.gif)
StartUp 思路方法工作期间(在宿主应用
![](/icons/70577chengxu.gif)
加载
![](/icons/70577chengxu.gif)
集时执行)加载数据
![](/icons/70577dou2.gif)
还添加了几个事件来负责前后浏览数据
![](/icons/70577dou.gif)
因此用户可通过单击按钮元素来在表中
![](/icons/70577de.gif)
客户数据间移动
![](/icons/70577dou2.gif)
为此
![](/icons/70577dou.gif)
针对绑定源使用 MovePrevious 和 MoveNext 思路方法:
CustomerInvoice {
public partial
CustomerDataFilterControl : UserControl {
private void btnDataPrevious_Click(object sender, EventArgs e) {
purchaseOrderDetailsBindingSource.MovePrevious
;
}
private void btnDataNext_Click(object sender, EventArgs e) {
purchaseOrderDetailsBindingSource.MoveNext
;
}
}
}
为将数据添加到内容Control控件
![](/icons/70577dou.gif)
我使用直接
![](/icons/70577de.gif)
思路方法来从每个用户Control控件文本框
![](/icons/70577de.gif)
Text 属性读取
![](/icons/70577yi.gif)
系列
![](/icons/70577zifu.gif)
串变量
![](/icons/70577dou2.gif)
然后
![](/icons/70577dou.gif)
将这些
![](/icons/70577zifu.gif)
串用作参数并设置文档中对应内容Control控件
![](/icons/70577de.gif)
每个 Text 属性
![](/icons/70577dou2.gif)
图 4 介绍说明了这
![](/icons/70577yi.gif)
举例技术
![](/icons/70577dou2.gif)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/f6add2d7-278d-4767-bb91-95ce19cfa584.g<img src='/icons/70577if.gif' />)
Figure4将数据添加到 Word 文档
CustomerInvoice {
public partial
CustomerDataFilterControl : UserControl {
private void btnAddData_Click(object sender, EventArgs e) {
companyName = txtCompanyName.Text;
purchaseOrder = txtPONum.Text;
workDetails = txtPODetails.Text;
companyAddress = txtAddress.Text;
contactPerson = txtContact.Text;
poTotal = txtTotal.Text;
addDataToWCCs(companyName, purchaseOrder, workDetails,
companyAddress, contactPerson, poTotal);
}
public void addDataToWCCs(
cmpyName,
poNum,
poDetails,
address,
contact,
total) {
Globals.ThisDocument.wccCustomerName.Text = cmpyName;
Globals.ThisDocument.wccCustomerAddress.Text = address;
Globals.ThisDocument.wccCustomerContact.Text = contact;
Globals.ThisDocument.wccWorkDescription.Text = poDetails;
Globals.ThisDocument.wccWorkItem.Text = poDetails;
Globals.ThisDocument.wccPurchaseOrderNum.Text = poNum;
Globals.ThisDocument.wccPurchaseOrderTotal.Text = total;
Globals.ThisDocument.wccTotalCharges.Text = total;
}
}
}
您可能已注意到
![](/icons/70577dou.gif)
内容Control控件有多个重复
![](/icons/70577de.gif)
![](/icons/70577zifu.gif)
串变量赋值
![](/icons/70577dou2.gif)
这是设计使然
![](/icons/70577dou.gif)
但由于在您
![](/icons/70577de.gif)
解决方案中
![](/icons/70577yi.gif)
个给定发票可能有多个 PO 工作项
![](/icons/70577dou.gif)
因此第 2个总额(在我
![](/icons/70577de.gif)
举例中指定给 wccTotalCharges)可能希望将
![](/icons/70577zifu.gif)
串变量视作十字制数
![](/icons/70577dou.gif)
并且
![](/icons/70577diaoyong.gif)
![](/icons/70577yi.gif)
个
![](/icons/70577hanshu.gif)
来将其汇总成发票总金额
![](/icons/70577dou2.gif)
对于第 2个工作详细信息内容Control控件 (wccWorkItem)
![](/icons/70577dou.gif)
![](/icons/70577yi.gif)
个思路方法是让表有
![](/icons/70577yi.gif)
个简短
![](/icons/70577de.gif)
介绍说明
![](/icons/70577dou.gif)
让详细信息有
![](/icons/70577yi.gif)
个更长
![](/icons/70577de.gif)
介绍说明
![](/icons/70577dou2.gif)
为简便起见
![](/icons/70577dou.gif)
我在两个内容Control控件间重用
![](/icons/70577zifu.gif)
串
![](/icons/70577dou2.gif)
我使用内容Control控件设计解决方案有以下 3个原因
![](/icons/70577dou2.gif)
第
![](/icons/70577yi.gif)
![](/icons/70577dou.gif)
内容Control控件非常适合于将数据绑定到 Word 文档(并且非常稳定)
![](/icons/70577dou2.gif)
第 2
![](/icons/70577dou.gif)
可锁定Control控件
![](/icons/70577de.gif)
内容
![](/icons/70577dou.gif)
从而使用户无法删除Control控件或编辑Control控件中
![](/icons/70577de.gif)
内容
![](/icons/70577dou2.gif)
最后
![](/icons/70577dou.gif)
可象处理 VSTO 项目中其他对象
![](/icons/70577yi.gif)
样处理Control控件
![](/icons/70577dou2.gif)
例如
![](/icons/70577dou.gif)
在图 4 中
![](/icons/70577dou.gif)
注意是使用 Globals 来访问每个内容Control控件
![](/icons/70577de.gif)
Text 属性
![](/icons/70577dou2.gif)
它仅是可管理
![](/icons/70577de.gif)
多个属性中
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
个
![](/icons/70577dou2.gif)
图 5 展示
![](/icons/70577de.gif)
是通过编程方式锁定内容Control控件
![](/icons/70577dou.gif)
因此用户无法删除或编辑Control控件
![](/icons/70577dou2.gif)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/f6add2d7-278d-4767-bb91-95ce19cfa584.g<img src='/icons/70577if.gif' />)
Figure5锁定内容Control控件
public void lockAllContentControls
{
Globals.ThisDocument.wccCustomerName.LockContentControl = true;
Globals.ThisDocument.wccCustomerAddress.LockContentControl = true;
Globals.ThisDocument.wccCustomerContact.LockContentControl = true;
Globals.ThisDocument.wccWorkDescription.LockContentControl = true;
Globals.ThisDocument.wccWorkItem.LockContentControl = true;
Globals.ThisDocument.wccPurchaseOrderNum.LockContentControl = true;
Globals.ThisDocument.wccPurchaseOrderTotal.LockContentControl = true;
Globals.ThisDocument.wccTotalCharges.LockContentControl = true;
}
此时构建并运行解决方案
![](/icons/70577dou2.gif)
结果应如图 6 所示
![](/icons/70577dou2.gif)
在此声明:我
![](/icons/70577de.gif)
设计还没有利用所有可用
![](/icons/70577de.gif)
VSTO 功能
![](/icons/70577dou2.gif)
例如
![](/icons/70577dou.gif)
还可使用功能区设计器来扩展功能区
![](/icons/70577dou.gif)
或使用 WPF Control控件来增强操作窗格中数据
![](/icons/70577de.gif)
可视效果
![](/icons/70577dou2.gif)
(如需将 WPF 用于 VSTO 操作窗格
![](/icons/70577de.gif)
举例
![](/icons/70577dou.gif)
请参阅 msdn2.microsoft.com/magazine/cc163292.aspx
![](/icons/70577dou2.gif)
)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/0dd786d6-6207-4e63-9cbf-b376c81b8432.g<img src='/icons/70577if.gif' />)
图 6处于调试模式
![](/icons/70577de.gif)
VSTO 自定义
设计就谈到这里
![](/icons/70577dou.gif)
接下来是
![](/icons/70577yi.gif)
项更为重要
![](/icons/70577de.gif)
任务
![](/icons/70577dou.gif)
将此
![](/icons/70577chengxu.gif)
集放入共享环境
![](/icons/70577dou2.gif)
最终
![](/icons/70577dou.gif)
由于 PO 流程涉及到许多人
![](/icons/70577dou.gif)
因此我希望确保此
![](/icons/70577chengxu.gif)
集处于
![](/icons/70577yi.gif)
个安全
![](/icons/70577de.gif)
共享环境中
![](/icons/70577dou2.gif)
但首先
![](/icons/70577dou.gif)
我将部署并确保自定义
![](/icons/70577de.gif)
安全
![](/icons/70577dou.gif)
以便员工可从 SharePo
![](/icons/70577int.gif)
中使用它
![](/icons/70577dou2.gif)
部署和安全性
执行进
![](/icons/70577yi.gif)
步操作的前
![](/icons/70577dou.gif)
右键单击解决方案并选择“清理解决方案”
![](/icons/70577dou2.gif)
它会从开发环境中删除所有版次
![](/icons/70577dou2.gif)
还希望确保已为 VSTO 自定义创建
![](/icons/70577yi.gif)
个文档库 — 本文稍后会用到它
![](/icons/70577dou2.gif)
要创建文档库
![](/icons/70577dou.gif)
只需导航到 SharePo
![](/icons/70577int.gif)
站点并单击“文档中心”|“层次结构”|“创建”|“文档库”
![](/icons/70577dou2.gif)
需提供
![](/icons/70577yi.gif)
些详细信息来介绍说明文档库
![](/icons/70577dou.gif)
然后单击“确定”
![](/icons/70577dou2.gif)
创建文档库后
![](/icons/70577dou.gif)
在部署和保护 VSTO 自定义时
![](/icons/70577dou.gif)
需要 URL
![](/icons/70577dou2.gif)
现在
![](/icons/70577dou.gif)
需设置
![](/icons/70577yi.gif)
个共享
![](/icons/70577dou2.gif)
我
![](/icons/70577de.gif)
开发环境包括 Windows Server® 2003、MOSS 2007、包含 VSTO 3.0
![](/icons/70577de.gif)
Visual Studio 2008 以及 2007 Office system Professional Edition
![](/icons/70577dou.gif)
因此在本地服务器(称为 MOSS)上设置共享
![](/icons/70577dou2.gif)
也可将企业中
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
个安全共享用作此
![](/icons/70577chengxu.gif)
集
![](/icons/70577de.gif)
发布点
![](/icons/70577dou2.gif)
为此
![](/icons/70577dou.gif)
需为
![](/icons/70577chengxu.gif)
集创建
![](/icons/70577yi.gif)
个目录(例如 C:CustomerInvoice)
![](/icons/70577dou2.gif)
右键单击新创建
![](/icons/70577de.gif)
文件夹并选择“共享和安全”
![](/icons/70577dou2.gif)
单击“共享该文件夹”单选按钮并为共享命名(如 CustomerInvoice)
![](/icons/70577dou2.gif)
单击“共享”选项卡
![](/icons/70577dou.gif)
然后单击“权限”按钮
![](/icons/70577dou2.gif)
添加“Everyone”并赋予“读取”权限
![](/icons/70577dou.gif)
添加“Administrators”并赋予“完全控制”权限
![](/icons/70577dou2.gif)
单击“安全”选项卡
![](/icons/70577dou.gif)
然后添加“Everyone”并赋予“读取及运行”、“列出文件夹内容”以及“读取”权限
![](/icons/70577dou2.gif)
此时
![](/icons/70577dou.gif)
共享做好了接收 VSTO 自定义
![](/icons/70577de.gif)
准备
![](/icons/70577dou2.gif)
(请注意
![](/icons/70577dou.gif)
根据安全策略
![](/icons/70577de.gif)
区别
![](/icons/70577dou.gif)
针对此共享委派权限
![](/icons/70577de.gif)
具体方式可能和我
![](/icons/70577de.gif)
做法有所区别
![](/icons/70577dou2.gif)
)
下
![](/icons/70577yi.gif)
步是将 VSTO
![](/icons/70577chengxu.gif)
集文件发布到该特定位置
![](/icons/70577dou2.gif)
在 Visual Studio 2008 中打开 VSTO 项目时
![](/icons/70577dou.gif)
右键单击项目并选择“属性”
![](/icons/70577dou2.gif)
在“项目属性”视图
![](/icons/70577de.gif)
“构建”选项卡中
![](/icons/70577dou.gif)
确保将输出路径设为刚为项目创建
![](/icons/70577de.gif)
共享
![](/icons/70577dou2.gif)
在我
![](/icons/70577de.gif)
举例中
![](/icons/70577dou.gif)
它是 mossCustomerInvoice
![](/icons/70577dou2.gif)
现在
![](/icons/70577dou.gif)
单击“发布”选项卡并将“Publishing Folder Location”(发布文件夹所在
![](/icons/70577de.gif)
位置)和“Installation URL”(安装 URL)设置为此共享(请参阅图 7)
![](/icons/70577dou2.gif)
同样
![](/icons/70577dou.gif)
对于我来说是 mossCustomerInvoice
![](/icons/70577dou2.gif)
单击“Publish Now”(立即发布)按钮
![](/icons/70577dou2.gif)
成功将 VSTO 项目发布到共享后
![](/icons/70577dou.gif)
可关闭项目
![](/icons/70577dou2.gif)
![将 VSTO 和 SharePo<img src='/icons/70577int.gif' /> 内容类型相集成](http://www.crazycoder.cn/WebFiles/20092/8ce5cdc4-cbbb-4e1d-ba61-01b72cd60ae3.g<img src='/icons/70577if.gif' />)
图 7发布 VSTO 自定义
此时
![](/icons/70577dou.gif)
项目已发布到安装位置
![](/icons/70577dou.gif)
但它在 Word 中还不是
![](/icons/70577yi.gif)
个受信任
![](/icons/70577de.gif)
![](/icons/70577chengxu.gif)
集
![](/icons/70577dou2.gif)
为使其成为受信任
![](/icons/70577de.gif)
![](/icons/70577chengxu.gif)
集
![](/icons/70577dou.gif)
需将文档
![](/icons/70577de.gif)
位置(存储在发布文件夹位置)添加到 Word 信任中心
![](/icons/70577dou2.gif)
打开 Word 并单击 Office 按钮(文档左上角
![](/icons/70577de.gif)
大圆形按钮)
![](/icons/70577dou2.gif)
单击菜单底部
![](/icons/70577de.gif)
“Word 选项”按钮并从左边
![](/icons/70577de.gif)
窗格中选择“信任中心”
![](/icons/70577dou2.gif)
然后
![](/icons/70577dou.gif)
单击“信任中心设置”按钮并从左边
![](/icons/70577de.gif)
窗格中选择“受信任位置”(请参阅图 8)
![](/icons/70577dou2.gif)
选中“Allow Trusted Locations _disibledevent=> 图 8将自定义添加到 Word 信任中心
还需添加用户将在其中使用此 VSTO 自定义
![](/icons/70577de.gif)
SharePo
![](/icons/70577int.gif)
文档库位置(例如 moss.litware.com/Docs/CustomerInvoice)
![](/icons/70577dou2.gif)
添加发布和 SharePo
![](/icons/70577int.gif)
位置后
![](/icons/70577dou.gif)
连续单击两次“确定”
![](/icons/70577dou.gif)
然后退出 Word
![](/icons/70577dou2.gif)
还需配置浏览器
![](/icons/70577de.gif)
受信任站点
![](/icons/70577dou2.gif)
首先
![](/icons/70577dou.gif)
打开 Internet Explorer® 并单击“工具”|“Internet 选项”
![](/icons/70577dou.gif)
然后单击“安全”选项卡
![](/icons/70577dou2.gif)
选择“受信任
![](/icons/70577de.gif)
站点”并单击“站点”按钮
![](/icons/70577dou2.gif)
可添加运行 VSTO
![](/icons/70577chengxu.gif)
集
![](/icons/70577de.gif)
站点(例如
![](/icons/70577dou.gif)
在本例中为 moss.litware.com)并确保取消选中“要求服务器验证”
![](/icons/70577dou2.gif)
现在
![](/icons/70577dou.gif)
通过导航到发布共享(如 mossCustomerInvoice)并打开文档(在本例中为 CustomerInvoice.docx)
![](/icons/70577dou.gif)
可测试 Word 文档
![](/icons/70577dou2.gif)
无论在 VSTO 项目中添加了何种自定义
![](/icons/70577dou.gif)
它们都应能正常运行
![](/icons/70577dou.gif)
但此时您不希望保存任何内容
![](/icons/70577dou.gif)
因此可关闭文档
![](/icons/70577dou.gif)
不保存
![](/icons/70577dou2.gif)
最后
![](/icons/70577yi.gif)
件事是创建
![](/icons/70577yi.gif)
个新
![](/icons/70577de.gif)
SharePo
![](/icons/70577int.gif)
内容类型
![](/icons/70577dou.gif)
并将其链接到自定义
![](/icons/70577de.gif)
文档
![](/icons/70577dou2.gif)
新建内容类型
内容类型是 Windows SharePo
![](/icons/70577int.gif)
Services (WSS) 中
![](/icons/70577de.gif)
![](/icons/70577yi.gif)
种类型定义
![](/icons/70577dou.gif)
可用于定义列表中
![](/icons/70577de.gif)
项或文档库中
![](/icons/70577de.gif)
文档
![](/icons/70577de.gif)
行为
![](/icons/70577dou2.gif)
可创建
![](/icons/70577yi.gif)
个自定义内容类型
![](/icons/70577dou.gif)
将它映射到
![](/icons/70577yi.gif)
个文档库(该文档库使用在本文前面创建
![](/icons/70577de.gif)
自定义模板)
![](/icons/70577dou2.gif)
将内容类型映射到自定义 VSTO
![](/icons/70577chengxu.gif)
集实质上包括 3个简单步骤
![](/icons/70577dou2.gif)
第
![](/icons/70577yi.gif)
步是在 SharePo
![](/icons/70577int.gif)
中实际创建内容类型
![](/icons/70577dou2.gif)
第 2步是将该内容类型和自定义 VSTO
![](/icons/70577chengxu.gif)
集相关联
![](/icons/70577dou2.gif)
第 3步是将新内容类型添加到 SharePo
![](/icons/70577int.gif)
文档库