VSTO 學(xué)習(xí)筆記(十三)談?wù)刅STO項(xiàng)目的部署
一般客戶計算機(jī)專業(yè)水平不高,但是有一些Office水平相當(dāng)了得,尤其對Excel的操作非常熟練。因此如果能將產(chǎn)品的一些功能集成在Office中,將會有很好的基礎(chǔ)。
但是由于客戶安裝的Office版本不一,所以VSTO項(xiàng)目的部署問題顯得尤為重要,需要考慮很多問題。
本系列所有測試代碼均在Visual Studio 2010 Ultimate SP1 + Office 2010 Professional Plus x64 SP1 上測試通過
大致歸納一下,主要有以下一些情況:
1、Office版本不同
目前主要有Office 2003、Office 2007、Office 2010。
2、32位與64位的Office
目前只有Office 2010提供64位版本。
3、64位操作系統(tǒng)安裝32位的Office
目前多出現(xiàn)在新上市的筆記本,很多都是Win7 64位,安裝了Office 2007、2010 32位。
此外,不同VSTO項(xiàng)目的部署方式也不相同。主要有如下一些VSTO項(xiàng)目類型:
1、文檔類型
如Word Document、Excel Workbook
2、AddIn類型
如Word AddIn、Excel AddIn
3、Shared AddIn類型
4、Excel自定義公式類型
下面我們就來逐個探討一下相應(yīng)的部署方案。
注意VS2010 只支持Office 2007、Office 2010,若要開發(fā)基于Office 2003的VSTO項(xiàng)目,請使用VS2005、VS2008。
一、待部署的項(xiàng)目是文檔類型
1.1、使用VS 2010創(chuàng)建一個Excel Workbook項(xiàng)目:
1.2、選擇Office 2007格式.xlsx:
1.3、在一個工作表中放置一個按鈕:
1.4、在其單擊事件中彈出一個對話框:
1.5、F5運(yùn)行,會打開Excel,點(diǎn)擊按鈕彈出我們希望看到的信息:
1.6、在Debug目錄下會發(fā)現(xiàn)生成了如下這些文件:
由于是文檔類型,因此生成一個Excel工作簿很正常。有一個.vsto格式的文件很少見,它就是VSTO項(xiàng)目部署時的安裝文件。
.vsto文件其實(shí)是一個XML文件,用文本編輯器打開可以看到具體內(nèi)容:
包含了VSTO項(xiàng)目的具體信息,如.NET運(yùn)行時版本,依賴的程序集,數(shù)字簽名等信息,不要手動修改這個文件。
.NET運(yùn)行時為4.0,所以客戶端首先要安裝.NET Framework 4.0。
.vsto的默認(rèn)打開方式是Visual Studio Tools For Office Execution Engine:
該組件包含于Visual Studio Tools For Office 運(yùn)行時,因此客戶端若要運(yùn)行VSTO程序,還需要安裝Visual Studio Tools For Office 運(yùn)行時。
Visual Studio 2010 Tools for Office Runtime 可以在這里下載。
1.7、我用了一個虛擬機(jī)模擬客戶端,安裝了.NET 4.0和Office 2010后就可以打開.vsto了:
1.8、安裝成功后就可以打開Debug中的Excel文件了:
注意文檔類型的VSTO項(xiàng)目安裝后只對發(fā)布的一個文檔有效(只對Debug中的Excel有效),不影響用戶其他的Office文件,即文檔類型項(xiàng)目不是全局性的。
1.9、在控制面板中可以將該VSTO項(xiàng)目卸載:
二、待部署的項(xiàng)目是Add In類型
2.1、新建一個Word Add In項(xiàng)目:
2.2、添加一個可視化Ribbon:
2.3、Ribbon中添加一個按鈕:
2.4、單擊彈出對話框:
2.5、F5運(yùn)行后會打開Word:
2.6、在Debug目錄中會生成一些文件:
2.7、客戶端依舊需要安裝.NET 4.0、Visual Studio 2010 Tools For Office Runtime才能運(yùn)行該VSTO項(xiàng)目:
注意Add In 類型是全局性的,只要安裝,用戶隨便打開一個Office文檔都會包含該Add In。
三、Shared AddIn類型
所謂Shared AddIn,就是該插件可以被多種Office文檔共用,但是一般都是針對一種Office文檔開發(fā)。
3.1、創(chuàng)建一個Shared AddIn項(xiàng)目:
3.2、這里我選擇只針對Excel:
3.3、設(shè)置加載屬性:
3.4、默認(rèn)有兩個項(xiàng)目,一個是插件,另一個是MSI安裝項(xiàng)目:
這里我們只談部署,關(guān)于如何開發(fā)相關(guān)的項(xiàng)目請參考其他資料。
添加System.Windows.Forms的引用,然后在Connect.cs中的OnStartupComplete事件中彈出一個對話框:
3.5、設(shè)置安裝項(xiàng)目屬性:
注意TargetPlatform沒有AnyCPU,故需要針對x86、x64分別編譯一份MSI安裝文件。
3.6、設(shè)置安裝項(xiàng)目運(yùn)行依賴組件:
這里可以設(shè)置需要.NET Framework 4.0:
在安裝項(xiàng)目屬性頁中的【Prerequisites】中可以設(shè)置更多的運(yùn)行依賴組件:
3.7、設(shè)置完成后編譯安裝項(xiàng)目,會生成相應(yīng)的MSI安裝包:
3.8、直接在安裝項(xiàng)目右擊àInstall即可以安裝:
安裝完后打開一個Excel就會看到我們的對話框:
四、Excel自定義公式類型
之所以把Excel自定義公式類型單獨(dú)拿出來說,是因?yàn)镋xcel自定義公式的注冊有些特殊,尤其是Excel 2010 x64。
4.1、創(chuàng)建一個類庫項(xiàng)目:
4.2、寫加減乘除四個函數(shù)和COM注冊、反注冊函數(shù):
View Code
using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace ExcelUDF
{
[Guid("E72F44C7-DD4A-4FA2-BC32-4EA9925749DB")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class ExcelUDF
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
public int Multiply(int a, int b)
{
return a * b;
}
public int Divide(int a, int b)
{
return a / b;
}
#region COM Related
[ComRegisterFunction]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
var key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
key.SetValue("", Environment.SystemDirectory + @"\mscoree.dll", RegistryValueKind.String);
}
[ComUnregisterFunction]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
}
private static string GetSubKeyName(Type type, string subKeyName)
{
var s = new System.Text.StringBuilder();
s.Append(@"CLSID\{");
s.Append(type.GUID.ToString().ToUpper());
s.Append(@"}\");
s.Append(subKeyName);
return s.ToString();
}
#endregion
}
4.3、我安裝的是Excel x64,需要手動注冊自定義公式的程序集,為此在項(xiàng)目屬性中的Build Events中寫入批處理腳本來自動注冊:
%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm /codebase "$(TargetPath)"
如果是Excel x86,這樣注冊:
%windir%\Microsoft.NET\Framework\v4.0.30319\regasm /codebase "$(TargetPath)"
部署到客戶端時需要執(zhí)行這個批處理腳本。
這樣在每次編譯成功后就會自動注冊該自定義公式。
4.4、在生成管理器中配置為 x64:
4.5、在Ribbon項(xiàng)目中添加調(diào)用自定義公式的代碼:
using Microsoft.Office.Tools.Ribbon;
namespace ExcelAddIn
{
public partial class RibbonDemo
{
private void RibbonDemo_Load(object sender, RibbonUIEventArgs e)
{
}
private void btnAdd_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula = "=Add()";
}
private void btnSubtract_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula = "=Subtract()";
}
private void btnMultiply_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula = "=Multiply()";
}
private void btnDivide_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula = "=Divide()";
}
}
4.6、修改Ribbon項(xiàng)目屬性,將 Excel設(shè)置為啟動的擴(kuò)展程序:
4.7、編譯、運(yùn)行,會調(diào)用Excel來打開,自動加載我們的插件ExcelAddIn:
4.8、激活自定義公式:
在【Developer】選項(xiàng)卡中點(diǎn)擊【Add-Ins】,再點(diǎn)擊【Automation】找到我們編寫的自定義公式,【OK】。
4.9、此時在Excel中就可以使用我們的公式了;
小結(jié):
1、若客戶使用的主要是Office 2003,則使用VS2008開發(fā)(.NET 3.5);若客戶使用Office 2007或更新版本,則使用VS2010來開發(fā)。(.NET 4.0)
2、一般的安裝順序?yàn)椋?
.NET Framework –> Visual Studio Tools For Office Runtime à MSI或.vsto
3、安裝之前最好將原來版本卸載,若.vsto出現(xiàn)無法安裝的情況,則可以使用Mage.exe清理一下緩存再嘗試安裝。
命令行下執(zhí)行:mage -cc
Mage.exe是Windows SDK中的一個小工具,安裝完Windows SDK后默認(rèn)位于:
C:\Program Files (x86)\Microsoft SDKs\Windows\xx\Bin àWindows x64
C:\Program Files\Microsoft SDKs\Windows\xx\Bin àWindows x86
其中xx是Windows SDK的版本號,如v6.0A、v7.0A、v7.1等。
使用VSTO開發(fā)建議客戶端安裝Office 2007或更新版本,因?yàn)閂STO本身就是對Office 2007或更新版本量身定制的。Office 2003由于歷史遺留問題,難以適應(yīng)新架構(gòu)。
對此需要引導(dǎo)客戶,雖然客戶是上帝,但是如果能說服客戶升級Office,則對用戶體驗(yàn)和項(xiàng)目后期的升級維護(hù)有顯著的好處。

浙公網(wǎng)安備 33010602011771號