VSTO, Visual Studio, MVP
RSS 2.0 Feed
原创
摘要:  曾经在一个 VSTO 2008 的讨论会上听到一些小型软件开发商的担忧:我们本来使用 C++ 为 Office 开发插件,然后通过互联网给用户下载,并且收取费用。现在我们想用 VSTO,但是发布插件的时候,居然要用户下载 200MB 的 .NET Framework???我的插件本身才 50K 哎!我的很多用户现在依然使用低速网络接入,200MB 的内容够他们下载整整一天的了,这样我的产品怎么卖得出去?   发布,很现实的问题,开发人员使用 VSTO 强大的功能,可以快速做出以前很难实现的功能,可是如果最后却很难把产品分发给用户,那前面的工作又有什么意义呢?在企业内部,我们可以通过“推送”的方法把 .NET Framework 方便地部署到每个客户端 PC,接下来再部署基于 VSTO 的解决方案就不是那么困难了;但是对于 ISV 呢,难道他们就注定和 VSTO 无缘了?   也许不是。   在先前的 Blog 里面我们提到过随着 Visual Studio 2008 SP1 的发布,VSTO 现在可以把“.NET 框架客户端配置(.NET Framework Client Profile)”作为目标框架。在这种配置下,如果目标系统没有安装 .NET Framework,那么安装程序将下载一个面向客户端应用程序的 .NET Framework 3.5 SP1 的子集。下载量将从原来的 200MB 缩小到 26.5MB。   那么如何使 VSTO 的解决方案使用针对客户端的配置呢? 创建一个新的 VSTO 加载项工程(针对 Office 2007) 打开工程属性页面 在“应用程序”选项卡的“目标框架”选项中,钩选“客户端配置文件子集” 保存工程   作了上述的修改之后,工程中所有对 .NET 框架类库的引用,都必须限制在“客户端配置文件”这个子集内,编译器会负责这项检查,并且指出超出范围的引用。关于“客户端配置文件”的详细信息,可以参阅这篇 MSDN 文档:.NET Framework 客户端配置文件。   在准备发布工程的时候,我们还需要在“工程属性”的“发布”页面里面对预安装选项进行调整:原先需要预安装完整版本的 .NET Framework 3.5 SP1 可以改为预安装 .NET Framework Client Profile。 ...[阅读全文]

posted @ | Feedback (8) | Filed Under [ VSTO 资源 原创 ]

摘要:  Visual Studio 2008 官方网页信息:Visual Studio 2008 SP1 Beta 和 .NET Framework 3.5 SP1 Beta 已经正式开发下载。   谁愿意吃螃蟹?我已经在自己的一台机器上安装了。关于 VSTO 有一些非常有趣的新功能,下一篇 Blog 就会介绍。   先提供下载地址:   英文版:http://www.microsoft.com/downloads/details.aspx?FamilyId=CF99C752-1391-4BC3-BABC-86BC0B9E8E5A&displaylang=en   .NET Framework 3.5 SP1 Beta:http://www.microsoft.com/downloads/details.aspx?FamilyId=23516C63-2DB2-4E7F-AABA-32B12D6E025C&displaylang=en   关于此 Beta 版本的说明:http://download.microsoft.com/download/8/F/D/8FD2A9F0-C3D4-4B0A-80AF-88D738DCDDF4/VSReadme.htm  ...[阅读全文]

posted @ | Feedback (2) | Filed Under [ VSTO 资源 原创 ]

摘要:  这个问题在中文、英文 MSDN 的 Office 开发论坛上都看到过(也正好都是我提供了答案),看来也算是一个“国际化需求”了。今天就记录一下和大家分享。   故事是这样的:开发人员有一个 WinForm 应用程序,它从数据库里面读取出一条记录后,获得了一个记录 ID,然后需要打开 Word 或者 Excel,用已经准备好了的 VSTO 文档或者是插件,根据这个记录 ID 生成相应的 Office 文档内容。问题是,怎么把这个 ID 传给 Word 或者 Excel?   有一个很简单的实现方法——直接在启动 Word / Excel 的命令行里面加参数!比如:   <Excel.exe> /r "D:\ExcelWorkbook1.xlsx" /e /id:1234   其中 <Excel.exe> 应该是 Excel.exe 的完整路径。    /r 后面跟 VSTO Excel 文档的完整路径。   /e 告诉 Excel 不要打开一个空白新文档。   /id:1234 就是自己定义的参数了,你可以在这里把你的ID号传入。当然参数名字也可以是其它的,并不是一定要“id”。    第二步,在 VSTO Excel 文档里面,可以通过下面的代码枚举命令行参数:   For Each a As String In Environment.GetCommandLineArgs        MsgBox(a)   Next   上面的代码如果被执行,会把所有命令行参数都显示出来。    只要找到其中/id:开头的参数,把数字取出来就好了。   对于 Word,也可以用类似的方法,只是 /r /e 之类的参数要换成对应的 Word 参数。   这个方法用在 Word 2007 / Excel 2007 没有问题,但是我不能保证将来的版本是否也可以这样用。特别是如果你添加的自定义参数不巧被新版本用作标准参数名的话……所以参数名最好独特一点啦。 ...[阅读全文]

posted @ | Feedback (0) | Filed Under [ VSTO 资源 雕虫小技 原创 ]

摘要:  上次在 TechEd 的时候就有很多朋友抱怨中文的 VSTO 书籍太少(还是没有?)。那我今天就要大声吆喝一下:咱 VSTO 也有官方中文参考书籍啦!!!——虽然不是我写的,也不是我翻译的,但是只要是 VSTO 相关的,我就要吆喝……   这本书的原作者现在分别是 Visual Studio 商业应用组(VSTO、VSTA、SharePoint 开发、数据访问工具、中小商业应用开发等)的首席开发经理 Eric Carter;Visual Studio 程序语言组(C#、VB.NET)的大佬 Eric Lippert……绝对的重量级人物。   这本书非常适合各类 VSTO 初学者仔细阅读,因为内容由浅入深,也一定程度上照顾了具有 Office VBA 开发经验、现在想迁移到 VSTO 平台的朋友们;也适合已经有一定经验的 VSTO 开发者在手边放一本以便随时查阅,因为书中的内容基本上很全面地覆盖了 VSTO 2005 的所有知识点,如果在开发过程中突然脑袋卡壳儿想不起来啥,翻翻书就能找到答案。   既然号称是“第一本”,自然也有很多不足之处。比如有些地方翻译得实在不怎么地,而介绍的产品也不是最新的版本。不过瑕不掩瑜,如果您面对全英文技术书籍感到头痛,那么这本书还是个不错的选择。   博文视点出的,我觉得稍微有点贵,定价¥99。游说能力强的弟兄们可以说服老板掏钱买一本加入公司的技术图书库里面,哈哈,别说是我的主意哦!   下面的图片:第一张是中文版封面,我也是今天刚看到,新鲜出炉的。另一张是我“左青龙右白虎”,分别托着原版和中文版,当时心中的体会“知识就是重量”,这两本书可真是重啊!!!   ...[阅读全文]

posted @ | Feedback (0) | Filed Under [ VSTO 资源 原创 ]

摘要:  之前的一篇 Blog 提到了关于在不同的 Culture 环境中对字符串的转换和比较需要注意的地方,这又让我想到了前一阵子在英文 MSDN 论坛 VSTO 板块上为一个用户解决的问题:   用 VSTO 开发一个 Outlook 的加载项,在 Outlook (以及这个加载项)运行的过程中,如果用户修改了“控制面板——区域设置”中的 Culture 信息,比如日期的显示格式;怎样在不重新启动 Outlook 或这个加载项的前提下马上反映出用户所做的修改?   我们的第一反应就是“在格式化数据(日期或者数字等等)的时候,用 CurrentCulture 就可以了”。可事实上这还不够。因为 CultureInfo 的相关信息在第一次被调用之后,就缓存起来了,直到它所在的 AppDomain 生命周期结束。如果系统的区域设置发生变化,CultureInfo 是不会自动反映出来的。我们需要用 CultureInfo.ClearCachedData 方法手工更新这些信息。   为了知道系统的区域设置发生了变化,我们可以通过注册 SystemEvents.UserPreferenceChanged 事件来获得通知。   另外值得注意的是,在加载项卸载之前,我们必须要注销事件通知,否则可能会发生内存泄漏。   完整示例代码: Imports System.Globalization Imports Microsoft.Win32 Public Class ThisAddIn     Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup         AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged     End Sub     Private Sub SystemEvents_UserPreferenceChanged(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)         If (e.Category = UserPreferenceCategory.Locale) Then  ' 发生变化的项目:区域设置             CultureInfo.CurrentCulture.ClearCachedData()         End If     End Sub     Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown         RemoveHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged     End Sub End Class ...[阅读全文]

posted @ | Feedback (0) | Filed Under [ VSTO 资源 雕虫小技 原创 ]

摘要:  原以为土耳其“I”的问题已经是老生常谈,但事实证明大家都知道未必就是大家都能做到。今天在一段代码里面又一次发现了这个错误。   很简单,下面的代码:    string msg = "Info";    if (msg.ToLower() == "info")    {        ....    }   看起来没有什么问题,if 里面的代码应该会被执行吧?但是在土耳其语的系统中,故事就不同了。如果当前线程默认 Culture 是土耳其语,那么不带任何参数的 ToLower 会按照土耳其语的规则转换字符“I”。 在土耳其语中,字母“i”的对应大写是“İ”,而字母“ı”的对应大写才是“I”。   所以,上面的代码将会得到“不等”的结果。要避免默认 Culture 对文化无关的字符串转换、比较造成干扰,我们要使用 CultureInfo.InvariantCulture,或者用诸如 ToLowerInvariant() 之类的方法。 否则一个不小心,可能会给将来的调试、维护带来很多意外的麻烦。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ 胡思乱想 随笔:随便写两笔 雕虫小技 原创 ]

摘要:在 MSDN 论坛上看到这样一个问题(原贴地址): “我在用 VSTO 2008 写一个 Outlook 2007 的插件。这个插件有一个窗体区域(Form Region)显示在‘约会’(Appointment)窗体中,我怎样才能捕捉‘约会’对象的‘保存’事件,以便在保存约会的时候执行一些我自己的代码?”     我提供了一个解决方案(其他类型的 Outlook 对象也有很类似的实现方法): 在用户区域装载的时候(FormRegionShowing 事件),把 OutlookItem 属性所引用的对象转换成 Outlook.Appointment 类型。 为 Appointment 注册 Write 事件的代码。 在 Write 事件处理方法中添加自定义代码实现业务逻辑要求。 当一个约会项目被显式(比如调用了 Save 方法或者按“保存”按钮)或者非显式(比如在关闭这个项目的窗口的时候作了答复操作)保存的时候,Write 事件就会被触发。这时候还可以通过设置 Cancel 参数来取消保存操作。 下面的代码片断展示了如何在 Form Region 里面注册 Write 事件。为了代码清晰,一切从简: 'Occurs before the form region is displayed.  'Use Me.OutlookItem to get a reference to the current Outlook item. 'Use Me.OutlookFormRegion to get a reference to the form region. Private Sub MyFormRegion_FormRegionShowing(ByVal sender As Object, _                                            ByVal e As System.EventArgs) _                                            Handles MyBase.FormRegionShowing     If TypeOf Me.OutlookItem Is Outlook.AppointmentItem Then         AddHandler CType(Me.OutlookItem, Outlook.AppointmentItem).Write, _                    AddressOf Item_Save     End If End......[阅读全文]

posted @ | Feedback (1) | Filed Under [ VSTO 资源 雕虫小技 原创 ]

摘要:  VSTO Power Tools 1.0 发布啦!   下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId=46B6BF86-E35D-4870-B214-4D7B72B02BF9&displaylang=en   总共九个小工具、扩展类库,被包含在三个安装文件内(因为授权类型有不同的三种,所以需要三个安装包)。其中的“VSTO Troubleshooter”、“Open XML Package Editor”和“Office Custom UI Manager”都有我们上海的 VSTO 团队参加了开发、测试。   VSTO Troubleshooter 是一个非常实用的工具,它可以分析当前系统的配置,并给出一个报告,指出当前环境如果需要运行 VSTO 开发的解决方案还缺少一些什么东西,或者是“万事俱备只欠东风”。如果客户在安装了你辛辛苦苦开发出来的 Office 加载项、VSTO 文档,却告诉你“出错了不能运行”,那么这个工具就是帮助你快速诊断原因的好帮手。   Open XML Package Editor 是一个图形界面的编辑器,可以直接打开 Open XML 格式的 Word、Excel、PowerPoint 文档察看、修改里面的内容。   Office Custom UI Manager 是一个开源的类库,通过这个库,开发人员可以更方便地管理 Office 界面上的常见控件元素:Ribbon、Custom Task Pane、Window、Explorer (Outlook)、Inspector (Outlook),和它们之间的从属关系。   这套工具都需要环境中安装了 Visual Studio Tools for Office 2008 和 2007 Office System。   如果你是使用 VSTO 的 Office 平台开发者,嫑犹豫了,赶快去下载吧!...[阅读全文]

posted @ | Feedback (1) | Filed Under [ 欢乐 CTI VSTO 资源 VSTA 资源 原创 ]

摘要:前言:TechEd 2008 回来之后,就一直计划着写一些关于 VSTO 2008 的东西。在 TechEd,我接触了一些希望使用 VSTO 做 Office 平台开发的业界同仁,发现很多朋友对 VSTO 还不是那么了解,所以在这次的《探索 VSTO 2008》系列里面,我会从最简单的内容写起。第一篇就是关于开发环境的设置和熟悉。后续的会有各种控件、组件、对象的使用,数据绑定,发布,安全性等各方面的专题。我希望每一篇都保持简短,保证大家有耐心看完然后快速上手实验。如果有写得不详细的地方,可以留言给我,保证有问必答。   Visual Studio 2008 宣布 RTM 也有那么几天了,相信不少微软技术发烧友早就迫不及待地从 MSDN Subscription 网站下载了火热出炉的光盘镜像。如果您没有 MSDN Subscription 也没关系,您可以到下列地址下载 90 天试用版本:http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx。注意,要使用 Visual Studio 2008 做 Office 平台开发,您必须安装 Visual Studio 2008 Professional 或者更高的 SKU,VSTO 目前还没有可以免费使用的 Express 版本(不过说不定哪天就有了哦)。   接下来我们看看怎么构建一个学习 VSTO 的实验环境。   首先如果条件允许,可以安装一个干净的系统。如果内存、硬盘空间足够,可以用虚拟机,至少分配 512MB 内存。操作系统可以用 Windows XP / Windows Vista 或者 Windows Server 2003。操作系统搞定之后,我推荐的安装顺序是:先安装 .NET Framework 2.0(如果是 Windows Vista 则跳过此步),接着用 Windows Update 把所有系统更新装好,然后再安装 2007 Office 系统套件,要确保安装其中的 .NET 编程支持。最后安装 Visual Studio 2008,确保 VSTO 安装组件。所有这些准备工作如果顺利的话,大约一个上午就可以完成。 确保.NET 编程支持的安装 确保VSTO组件的安装   好了,迫不及待打开 Visual Studio 2008 的界面,创建新工程。VSTO 2008 项目模板在“新建工程”的对话框中有三种地方可以找到: C# 或者 Visual Basic 语言节点,可以找到最常用的 Word、Excel、Outlook 模板 Office 节点,可以找到所有的 VSTO 模板,其中的 2003、2007 节点则根据 Office 版本进行了区分 Workflow 节点,可以找到 SharePoint 2007......[阅读全文]

posted @ | Feedback (7) | Filed Under [ VSTO 资源 原创 ]

摘要:我在北京 TechEd 2007 讲的课程,PowerPoint 幻灯片可以在此下载。 接下来的几个星期里,我将陆续把这次课程的内容以 Blog 的形式在博客堂发布(并且加以扩展),以帮助对 VSTO 感兴趣的朋友们尽快上手这个最酷的 Office 平台开发工具。 希望今后可以看到更多使用 VSTO 开发的解决方案!...[阅读全文]

posted @ | Feedback (4) | Filed Under [ VSTO 资源 原创 ]

摘要:  之前提到了 VSTO 2005 SE (以下简称 Cypress) 开发的 Office 插件可能无法被装载,微软已经提供了修正此问题的更新程序。现在我们来探究一下引发此问题的根本原因——谁动了我的插件?   先了解一下 Cypress 针对 Office 2003 插件的基本装载原理。用 Cypress 开发的 Office 插件并不是直接被 Office 应用程序加载的,编译得到的 .NET 程序集没有被注册为 COM 组件,而是由一个 Cypress 提供的“Loader”加载。向 Office 应用程序注册插件信息的时候,COM 注册信息中“InprocServer32”实际上指向 Cypress Add-in Loader,并且提供一个清单文件(Manifest)告诉 Loader 真正应该加载的 .NET 程序集信息。这样做的好处有很多:各个 VSTO 开发的插件不会互相干扰(Loader 会为它们创建各自的应用程序域);Loader 还可以帮助检查插件的新版本、提供插件自动升级功能;还可以对插件程序集的安全权限进行控制等等。   至于 COM 注册信息,我们知道在 Windows 中有三个地方可以存放(不考虑 Wow64 的情况):  HKEY_CURRENT_USER\Software\Classes  HKEY_LOCAL_MACHINE\Software\Classes  HKEY_CLASS_ROOT (上面两个的合并版本)   在 Cypress 的 RTM 版本中,插件的 COM 注册信息被写入 HKEY_CURRENT_USER\Software\Classes。因为这样做可以保证开发人员不需要管理员权限就可以调试、部署。这种方法在 Windows 2000 / XP / 2003 的平台上没有任何问题。而在 Windows Vista 中,新的安全特性“Mandatory Integrity Control ”使包括 Office 2003 在内的 COM 应用程序行为发生了变化。如果应用程序是以“中等”或者更低的 Integrity Level 运行,COM 信息会从 HKEY_CLASS_ROOT 读取,包含了 Cypress 写入 HKEY_CURRENT_USER\Software\Classes 中的信息;但是如果应用程序以高于“中等”的 Integrity Level 运行(即“以管理员身份运行”),或者 UAC 关闭,COM 信息只从 HKEY_LOCAL_MACHINE 中读取。在这种情况下,Office 2003 无法找到 Cypress 插件写入的信息,所以就导致插件装载失败!   如果开发者在 Windows Vista 中“以管理员身份”启动 Visual Studio 2005,就会因为上述的原因无法在......[阅读全文]

posted @ | Feedback (1) | Filed Under [ VSTO 资源 原创 ]

摘要:  刚才想在自己的邮件机器上做一个 Outlook 插件的小实验,却发现 Visual Studio 2005 不能正确启动 Outlook 进入调试模式。感觉奇怪之余,马上想到“不能启动 Outlook”的真正原因可能是 Outlook 已经在内存中了。随后打开任务管理器证实了这一点。原来是 Windows Mobile Device Center 已经通过 COM 调用启动了 Outlook(同步数据用,无界面显示),所以 Visual Studio 2005 就无法再启动一个 Outlook 进程开始调试了。   解决方法就是断开 Windows Mobile 设备连接,WMDC 会释放对 Outlook 的 COM 引用;如果没有别的程序也保持着对 Outlook 的 COM 引用,那么 Outlook.exe 就会从内存中卸载。   平时一般都在专门的 Lab 机器上做实验,没有其它软件的干扰。如果在相对杂乱的环境里面做开发,务必要先排除其它软件可能造成的影响。特此记录。 ...[阅读全文]

posted @ | Feedback (1) | Filed Under [ VSTO 资源 原创 ]