Visual Studio, .NET, Support Engineering, MSDN, CodeFx

程序怪人的工作间

MSDN技术支持工程师
随笔 - 30, 评论 - 48, 引用 - 2

导航

标签

每月存档

最新留言

  • re:300多个Sample工程,你怎么查找自己想要的?
    <p>&nbsp;</p> <p>Many gaming companies have been introducing new games on a re...
    by ewf433554(注册) on 2010/3/9 15:24:18
  • 求助VSTO的加载慢问题
    <p>你好!</p> <p>我部署后的VSTO程序的局域网内,没有连到internet。每次打开VSTO EXCEL都特别慢,大概30秒左右。别的同事也一样。很是苦...
    by summer(注册) on 2010/1/20 19:56:26
  • 关于VSTO问题请教
    <p>你好,我这两天在用C#做一个Outlook的插件,但是我有很多问题没有办法解决,在网上查了很多资料都发现没有太大帮助,可以加我QQ,给我指教一下吗?&nbsp; 谢谢哈<...
    by 丑猪儿(注册) on 2009/8/31 13:53:40
  • re: VSTO 先瘦身再发布:客户端配置文件
    re: dotAge 请确定在工程发布属性的预安装选项里面选择了“.NET Framework Client Profile”,并且没有选择“.NET Framework 3.5 SP1”,后者...
    by vsto(匿名) on 2008/10/31 14:01:38
  • re: vsto
    虽然我选择的是CDROM安装,但其实并不是说要刻个CD给用户,而是要做成一个本地的完全独立安装包。从客户体验角度讲,启动了一个setup以后,再让他等半天的感觉很不好。并且,即使下载时间相同,他们也宁...
    by dotAge(匿名) on 2008/10/27 17:58:35
  • re: VSTO 先瘦身再发布:客户端配置文件
    yanshuai: 你列出的那个 255.6MB 的安装包是用来给管理员在企业内部环境配置 .NET Client Profile 再分发用的,里面应该包含了适用于各种版本 Windows (XP /...
    by vsto(匿名) on 2008/10/24 11:48:51
  • re: VSTO 先瘦身再发布:客户端配置文件
    dotAge: 如果是在企业内部通过 UNC 发布,如果没有很苛刻的网络速率或者流量限制,其实完全可以考虑使用完整版本的 .NET Framework。因为很有可能其它的基于 .NET 的应用程序还是...
    by vsto(匿名) on 2008/10/24 11:44:07
  • re: VSTO 先瘦身再发布:客户端配置文件
    4color: 相比用 C++ 开发的 Office 加载项工程,26.5M 的客户端配置依然显得比较大。但是从 .NET 提供的功能、开发效率、调式难度等多方面综合考量,这样的配置有时候已经可以让我...
    by vsto(匿名) on 2008/10/24 10:54:39
  • re: VSTO 先瘦身再发布:客户端配置文件
    20多M另外的下载,还是很多的!!
    by 4color(匿名) on 2008/10/23 16:09:18
  • 仅适用于WebSite publish方式?
    如果我选择从UNC/CDROM位置发布,好像仍然是一个巨大的Framework分发包。
    by dotAge(匿名) on 2008/10/23 10:22:11
  • re: VSTO 先瘦身再发布:客户端配置文件
    The install location for prerequisites has not been set to 'component vendor's web site' and the fil...
    by yanshuai(匿名) on 2008/10/22 12:24:07
  • re: Visual Studio 2008 SP1 Beta 可以下载啦!
    已经更新,包含了正式下载页面的信息。
    by vsto(匿名) on 2008/5/13 10:48:50
  • re: Visual Studio 2008 SP1 Beta 可以下载啦!
    能否提供下载页面,而不仅仅是exe文件链接?毕竟主要想先看Release Note以评估改进之处
    by Ninputer(匿名) on 2008/5/12 7:53:42
  • re: 怎样捕捉 Outlook 对象的“保存”事件?
    不错!!
    by intermapper(匿名) on 2008/3/5 13:55:59
  • re: 谁想要 Xbox 360?
    诶~~不错,不错 可惜,自己英文不好啊~另外也不到怎么发现BUG
    by Gyc(匿名) on 2008/3/2 13:51:58

广告

给 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 on 2008-04-07 11:11:17 by vsto  评论(0) 阅读(4860)

在加载项中更新 CultureInfo 信息

  之前的一篇 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 on 2008-03-21 02:17:08 by vsto  评论(0) 阅读(3553)

又是土耳其“I”!

  原以为土耳其“I”的问题已经是老生常谈,但事实证明大家都知道未必就是大家都能做到。今天在一段代码里面又一次发现了这个错误。

  很简单,下面的代码:

   string msg = "Info";
   if (msg.ToLower() == "info")
   {
       ....
   }

  看起来没有什么问题,if 里面的代码应该会被执行吧?但是在土耳其语的系统中,故事就不同了。如果当前线程默认 Culture 是土耳其语,那么不带任何参数的 ToLower 会按照土耳其语的规则转换字符“I”。

在土耳其语中,字母“i”的对应大写是“İ”,而字母“ı”的对应大写才是“I”。

  所以,上面的代码将会得到“不等”的结果。要避免默认 Culture 对文化无关的字符串转换、比较造成干扰,我们要使用 CultureInfo.InvariantCulture,或者用诸如 ToLowerInvariant() 之类的方法。 否则一个不小心,可能会给将来的调试、维护带来很多意外的麻烦。

posted on 2008-03-20 23:41:27 by vsto  评论(0) 阅读(3769)

怎样捕捉 Outlook 对象的“保存”事件?

在 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 Sub

Private Sub Item_Save(ByRef Cancel As Boolean)
    MsgBox("This appointment is to be saved!", vbOKOnly Or vbInformation)
End Sub

posted on 2008-03-03 17:49:10 by vsto  评论(1) 阅读(4421)

Powered by: Joycode.MVC引擎 0.5.2.0