如何使用.NET開發全版本支持的Outlook插件產品(一)——准備工作


這半年一直在做Outlook的插件,因為不會VC++,所以想找一款基於.NET,用C#開發Outlook插件的技術方案。沒想到,光技術選型這件事,就用各種技術手段驗證了將近一個月,還花費了大量的精力做之后的各項開發工作。在此開個大坑,以此記錄所有的技術成果,如果以后還有別的朋友要做Outlook,甚至於Office插件,都可以從這兒作為起步,因為Office插件的基礎技術都是一致的,只是到了各個產品內部COM對象有特性差異。

好了,廢話不多說,我們開始正文。

 

技術選型

如果提到要做Office插件,大家都會去網上找,當然最快得到的一個應該就是VSTO。雖然我們最后沒有采用這個方案,但是我還是想在這兒稍微介紹一下它,因為它有自己非常強大的優點。

VSTO是Visual Studio Tools for Office的簡稱,在我看來,是和Visual Studio集成得最棒的插件開發SDK。如果你下載安裝了VSTO,並且你使用Visual Studio的話,你會在創建項目的一開始就找到“Office插件”項目類型,之后有一系列的交互界面來引導你一步一步創建一個符合你要求的插件基礎類型,甚至最后連界面都可以用所見即所得的方式進行設計——當然后台的代碼也是完全面向對象的,你可以用最方便的方法來快速制作一個插件並進行打包部署。如果你的最終目標只是做一個為企業內部部署,並且你可以控制安裝部署發布甚至面向特定Outlook版本的話,我強烈推薦你采用它,因為我一直奉行適用就是完美,不需要為了追求無意義的技術專精而采用其它方案。

但是,如果你像我一樣,要做一款需要適用於各個操作系統(當然是XP以上,2000啥的咱就不提了),還需要支持所有Outlook版本(2003以上),還需要完全控制安裝部署等一系列后續事宜,完全把這個插件當做一個產品為開發目標的話,VSTO這件看起來很美好的東西實際用起來不一定那么美好,原因有以下幾點:

  1. 無法控制的面向對象版本——VSTO是針對固定Office版本的,如果你下載了2013版的,那很可能無法兼容2003。
  2. 無法適應多版本——在使用VSTO的時候,是無法針對各個版本來定制界面的。大家知道從Office 2010開始,菜單就采用了Ribbon樣式,而2007以下還都是經典菜單欄。事實上,你無法在使用VSTO的情況下來為這些版本定制不同的界面,這非常復雜。
  3. 無法控制的發布——眾所周知,你一開始用了MS的東西,后面不用都不行,簡直就是一個黑洞。如果你用了VSTO作為開發框架,那打包很可能就是InstallShield(現在最新版的VS里面已經沒有Installation Project了,而且InstallShield是收費的)。而這東西你完全不知道如何才能控制它的行為,讓它在x86和x64上都能成功部署插件。要知道,Office插件是需要寫注冊表鍵值才能成功安裝的。

好了,既然用現成的東西走不通,我們就索性找找開源免費的東西吧。幸好,我們找到了最后的技術方案(中間經歷的痛苦和大量技術驗證工作真是無法用文字形容),NetOffice和Wix。

 

 

基礎框架

NetOffice是一套開源的,基於.NET的Office插件開發框架,大家可以訪問下面的鏈接來下載它。

http://netoffice.codeplex.com/

NetOffice支持多個.NET版本,從2.0到4.5都有,因此已經涵蓋我們現有的所有.NET版本。

我們最后的選型是3.5,這里面也是經過慎重推敲的。3.5版本的.NET Framework是從Windows 7開始支持的,對於Windows 7以上版本的操作系統,都可以不需要安裝.Net Framework就可以運行。但是有一點只有是做.NET的人都知道,就是3.5安裝包的尺寸非常大,難道要用戶下載安裝這么大的基礎庫包嗎?我們的解決方案是,發布的時候,不帶.NET Framework。那如果是XP用戶怎么辦?我們的安裝包自動下載安裝4.0版本.NET Framework。我們就用這種方法成功解決了兼容性和下載精簡性的兩難問題。再說了,現在微軟馬上就不再支持XP的持續更新了,XP的生命說實話真的進入倒計時了,我們也不要再在這樣的系統上花費更多精力了。

Wix在我另外的博文里面也有介紹,是一款非常好用的打包安裝框架。當然之前我的文章里面對它的介紹太為膚淺,這次,我們將它翻了一個底朝天。現在,我們已經可以做到這樣的安裝了。在這次的技術介紹中,我也會對Wix的高級使用開發進行詳細講解。應該可以涵蓋幾乎所有的打包安裝Case,方便大家以后更高效得制作更優秀的安裝包。下面的截圖我進行了一些打碼處理,因為畢竟涉及商業問題,請各位見諒。

1

 

創建工程環境

有了以上的框架技術基礎,我們就可以來創建我們的第一個Outlook插件項目了,因為我現在用的是Office 2013,我們先做一個簡單的Outlook 2013插件好了。其實這個插件2010也能用,因為插件UI是用Ribbon。

我們先用“管理員身份”運行Visual Studio。因為我們開發的是一個COM類型的類庫,而這個類庫需要向注冊表注入一些鍵值,VS需要管理員身份才能自動完成這些操作。你問怎么用管理員身份運行?在圖標上右鍵點擊,展開的菜單里面就有。

 

然后我們創建一個“類庫”項目,我們起個項目名稱叫“TestOutlookAddin”,記得.NET的版本是3.5。隨后我們添加NetOffice相應3.5版本的以下dll文件引用:

extensibility.dll

NetOffice.dll

OfficeApi.dll

OutlookApi.dll

 

我們再調整解決方案的編譯環境,必須要有x86和x64兩種。因為插件是對Office版本敏感的,x64的Office只能加載x64編譯得到的插件dll,同樣的,x86版本Office也只能加載x86版本dll。

 

我們還要對項目進行屬性設置。

在“應用程序”標簽頁中,點擊“程序集信息…”,在打開的對話框中勾選“使程序集COM可見”。

在“生成”標簽頁中,勾選“為COM互操作注冊”。

在“調試”標簽頁中,將“啟動操作”勾選“啟動外部程序”,並且填入你機器上的Outlook.exe啟動路徑,在我的機器上,路徑如下:

C:\Program Files\Microsoft Office\Office15\OUTLOOK.EXE

 

修改完這個以后,我們先進入C:\Program Files\Microsoft Office\Office15\,也就是Outlook.exe的所在文件夾,看看有沒有outlook.exe.config文件。如果沒有這個文件,請創建這個文件,並在文件里面寫入以下XML

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v1.0.3705" />
    <supportedRuntime version="v1.1.4322" />
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>

這個文件必須和Outlook.exe在同一個文件夾中。如果沒有這個文件,我們將無法進入調試狀態。我想沒有人能在不調試的情況下編寫一整個插件吧?

 

編寫樣例代碼

我們把環境的裝備工作做好了,下面就來編寫最簡單的插件。

我們先在項目中創建一個RibbonUI.xml,並把它的生成操作定義為“嵌入的資源”,內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<customUI onLoad="LoadAction"  xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
  <ribbon>
    <tabs>
      <tab id="RibbonAddinSampleTabCS35" label="插件標簽">
        <group id="group1" label="分組名">
          <button id="customButton1" size="large" label="按鈕"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

對於Outlook 2007以上的版本來說,這個文件就是定義新增的菜單欄界面的。

然后再在項目中創建一個名為COMEntry的類,代碼如下:

using System.Runtime.InteropServices;
using NetOffice.OutlookApi.Tools;
using NetOffice.Tools;

namespace TestOutlookAddin
{
    [COMAddin("Test Addin For Outlook", "", 3), CustomUI("TestOutlookAddin.RibbonUI.xml"), RegistryLocation(RegistrySaveLocation.CurrentUser)]
    [Guid("AFE67651-951D-4A42-8CAB-E9BF7E219DDF"), ProgId("TestAddinForOutlook")]
    public class COMEntry : COMAddin
    {
    }
}

其中COMAddin特性類聲明了一系列需要加載和插件初始化的信息,它的參數有“插件在Outlook插件列表中的顯示名稱”,“插件在列表中的描述”,“啟動類型(3代表跟隨Outlook啟動而自動啟動)”。

CustomUI表示了剛才我們定義的RibbonUI.xml作為嵌入的資源的資源訪問路徑,這點對於有一定經驗的.NET開發人員一定不陌生。

RegistryLocation是定義了插件在注冊表中注冊到哪個根鍵值里面去。我們知道現在Windows安裝文件都有“僅為我”和“所有人”安裝選項,這個特性也是為了區分它的。不過這個僅僅是在調試狀態下,因為發布的時候這個鍵值還是會由我們的安裝包來自行控制,所以不需要在這個地方做過多糾結。

 

好了,我們在VS按下F5調試查看一下效果吧,如下圖

image

我們得到了一個新的標簽,標簽內部有個新的分組和空白的“按鈕”,鼠標移到按鈕上,就會自動出現下面的彈出說明框。

在此,需要先進行一個聲明,下方的這個彈出說明框是可以自定義標題和內容的,但是最下方的插件名稱超鏈接和“詳細信息”是無法去掉的。微軟官方的解釋是:為了區分這個到底是一個第三方插件還是Outlook自身自帶的按鈕。因為他們擔心一些質量很差的插件影響了Outlook自身的行為,用戶還要怪罪到微軟頭上。因此他們就用這種方法來明顯區別插件和自身控件了。

 

現在我們已經得到了最初始版本的插件,當然現在什么事情都不能做。在下一篇中,我們將談談如何定位插件的部署錯誤,以及對插件進行更多的自定義操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM