使用VS2008开发Excel AddIn,在部署的时候会出现很多奇怪的问题。
如:在开发机器上安装没有问题,然而到一台普通的机器上时则可能会出现安装不上的问题。
那么遇到此种情况首先需检查安装程序是否做了如下操作:
1)为你的Excel AddIn进行策略授权(Caspol)
2)客户环境是否安装了Microsoft Office 2003 Primary Interop Assemblies
3)客户环境是否安装了Microsoft Visual Studio 2005 Tools for Office Runtime
如果以上三步都已经符合要求了,那么则需要你在AddIn的构造函数中是否添加了代码(这个地方如果你初始化了自己的自定义对象可能会因为你的程序集尚未装载到内存而导致无法初始化的错误:未将对象设置到实例。这样你的程序AddIn将会无法正常加载,抛出加载时错误或本Excel禁用)。
下面的代码可以放在安装包的Commit时执行:
代码
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Diagnostics;
6 using Microsoft.Win32;
7
8 namespace CTPExcelAddInInstall
9 {
10 class Program
11 {
12 static System.IO.StreamWriter sw = null;
13 static void Main(string[] args)
14 {
15 string fullpath = System.Reflection.Assembly.GetExecutingAssembly().Location;
16 string installLocation = fullpath.Substring(0, fullpath.LastIndexOf('\\'));
17
18 sw = System.IO.File.CreateText("C:\\CTPExcelAddInstall.log");
19 sw.WriteLine("安装路径:" + installLocation);
20
21 sw.WriteLine("开始安装时间:" + DateTime.Now.ToString());
22
23 try
24 {
25 CaspolExcelAddInFiles(installLocation);
26
27 sw.WriteLine("成功执行授权脚本!");
28
29 }
30 catch (Exception exp)
31 {
32 sw.WriteLine("为应用程序授权时出错,错误信息:" + exp.Message);
33 }
34
35 try
36 {
37 InstallOfficePIA(installLocation);
38
39 sw.WriteLine("成功执行安装 Office 2003 Primary Interop Assemblies!");
40 }
41 catch (Exception expPIA)
42 {
43 sw.WriteLine("执行安装 Office 2003 Primary Interop Assemblies 时出错,错误信息:" + expPIA.Message);
44 }
45
46 try
47 {
48 RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Visual Studio 2005 Tools for Office Runtime");
49 if (regKey == null)
50 {
51 InstallVSTO2005(installLocation);
52 }
53 }
54 catch (Exception expVSTO)
55 {
56 sw.WriteLine("执行安装Microsoft Visual Studio 2005 Tools for Office Runtime 时出错,错误信息:" + expVSTO.Message);
57 }
58
59
60
61 sw.WriteLine("结束安装时间:" + DateTime.Now.ToString());
62 sw.Close();
63
64 System.Threading.Thread.Sleep(2000);
65 }
66
67 /// <summary>
68 /// 安装 Office 2003 Primary Interop Assemblies
69 /// </summary>
70 /// <param name="filePath">安装文件路径</param>
71 static void InstallOfficePIA(string filePath)
72 {
73 Process pExecPIA = new Process();
74 pExecPIA.StartInfo.FileName = "MSIEXEC.EXE";
75 pExecPIA.StartInfo.WorkingDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727";
76 pExecPIA.StartInfo.CreateNoWindow = true;
77 pExecPIA.StartInfo.Arguments = " /i \"" + filePath + "\\O2003PIA .msi\"";
78 pExecPIA.StartInfo.UseShellExecute = false;
79 pExecPIA.StartInfo.RedirectStandardInput = true;
80 pExecPIA.StartInfo.RedirectStandardOutput = true;
81 pExecPIA.StartInfo.RedirectStandardError = true;
82 pExecPIA.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
83 pExecPIA.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
84 pExecPIA.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
85 pExecPIA.Start();
86 pExecPIA.BeginOutputReadLine();
87 pExecPIA.BeginErrorReadLine();
88 pExecPIA.Close();
89 }
90
91 /// <summary>
92 /// Excel插件执行策略授权
93 /// </summary>
94 /// <param name="filePath">授权文件夹</param>
95 static void CaspolExcelAddInFiles(string filePath)
96 {
97 Process pCaspolCMD = new Process();
98 pCaspolCMD.StartInfo.FileName = "cmd.exe";
99 pCaspolCMD.StartInfo.UseShellExecute = false;
100 pCaspolCMD.StartInfo.RedirectStandardInput = true;
101 pCaspolCMD.StartInfo.RedirectStandardOutput = true;
102 pCaspolCMD.StartInfo.RedirectStandardError = true;
103 pCaspolCMD.StartInfo.WorkingDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727";
104 pCaspolCMD.StartInfo.CreateNoWindow = true;
105 pCaspolCMD.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
106 pCaspolCMD.StartInfo.Arguments = "/K \r\nCaspol -u -ag All_Code -url \"" + filePath + "\\*\" FullTrust -n \"CTPExcelAddIn\"";
107 pCaspolCMD.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
108 pCaspolCMD.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
109 pCaspolCMD.Start();
110 pCaspolCMD.StandardInput.WriteLine("y");
111
112 pCaspolCMD.BeginOutputReadLine();
113 pCaspolCMD.BeginErrorReadLine();
114
115 pCaspolCMD.Close();
116 }
117
118 /// <summary>
119 /// 安装 VSTO 2005 Runtime
120 /// </summary>
121 /// <param name="filePath">安装文件路径</param>
122 static void InstallVSTO2005(string filePath)
123 {
124 string DirectoryName = filePath + "\\Microsoft Visual Studio 2005 Tools for Office Runtime";
125
126 if (System.IO.Directory.Exists(DirectoryName))
127 {
128 Process pVSTO2005 = new Process();
129 pVSTO2005.StartInfo.FileName = DirectoryName + "\\install.exe";
130 pVSTO2005.StartInfo.WorkingDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727";
131 pVSTO2005.StartInfo.CreateNoWindow = false;
132 pVSTO2005.StartInfo.UseShellExecute = true;
133 pVSTO2005.Start();
134 pVSTO2005.Close();
135
136 sw.WriteLine("成功执行安装 Microsoft Visual Studio 2005 Tools for Office Runtime!");
137 }
138 else
139 {
140 sw.WriteLine("未找到“Microsoft Visual Studio 2005 Tools for Office Runtime”安装目录:" + DirectoryName);
141 }
142 }
143
144 static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
145 {
146 Console.WriteLine(e.Data);
147 }
148
149 }
150 }
151
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Diagnostics;
6 using Microsoft.Win32;
7
8 namespace CTPExcelAddInInstall
9 {
10 class Program
11 {
12 static System.IO.StreamWriter sw = null;
13 static void Main(string[] args)
14 {
15 string fullpath = System.Reflection.Assembly.GetExecutingAssembly().Location;
16 string installLocation = fullpath.Substring(0, fullpath.LastIndexOf('\\'));
17
18 sw = System.IO.File.CreateText("C:\\CTPExcelAddInstall.log");
19 sw.WriteLine("安装路径:" + installLocation);
20
21 sw.WriteLine("开始安装时间:" + DateTime.Now.ToString());
22
23 try
24 {
25 CaspolExcelAddInFiles(installLocation);
26
27 sw.WriteLine("成功执行授权脚本!");
28
29 }
30 catch (Exception exp)
31 {
32 sw.WriteLine("为应用程序授权时出错,错误信息:" + exp.Message);
33 }
34
35 try
36 {
37 InstallOfficePIA(installLocation);
38
39 sw.WriteLine("成功执行安装 Office 2003 Primary Interop Assemblies!");
40 }
41 catch (Exception expPIA)
42 {
43 sw.WriteLine("执行安装 Office 2003 Primary Interop Assemblies 时出错,错误信息:" + expPIA.Message);
44 }
45
46 try
47 {
48 RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Visual Studio 2005 Tools for Office Runtime");
49 if (regKey == null)
50 {
51 InstallVSTO2005(installLocation);
52 }
53 }
54 catch (Exception expVSTO)
55 {
56 sw.WriteLine("执行安装Microsoft Visual Studio 2005 Tools for Office Runtime 时出错,错误信息:" + expVSTO.Message);
57 }
58
59
60
61 sw.WriteLine("结束安装时间:" + DateTime.Now.ToString());
62 sw.Close();
63
64 System.Threading.Thread.Sleep(2000);
65 }
66
67 /// <summary>
68 /// 安装 Office 2003 Primary Interop Assemblies
69 /// </summary>
70 /// <param name="filePath">安装文件路径</param>
71 static void InstallOfficePIA(string filePath)
72 {
73 Process pExecPIA = new Process();
74 pExecPIA.StartInfo.FileName = "MSIEXEC.EXE";
75 pExecPIA.StartInfo.WorkingDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727";
76 pExecPIA.StartInfo.CreateNoWindow = true;
77 pExecPIA.StartInfo.Arguments = " /i \"" + filePath + "\\O2003PIA .msi\"";
78 pExecPIA.StartInfo.UseShellExecute = false;
79 pExecPIA.StartInfo.RedirectStandardInput = true;
80 pExecPIA.StartInfo.RedirectStandardOutput = true;
81 pExecPIA.StartInfo.RedirectStandardError = true;
82 pExecPIA.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
83 pExecPIA.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
84 pExecPIA.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
85 pExecPIA.Start();
86 pExecPIA.BeginOutputReadLine();
87 pExecPIA.BeginErrorReadLine();
88 pExecPIA.Close();
89 }
90
91 /// <summary>
92 /// Excel插件执行策略授权
93 /// </summary>
94 /// <param name="filePath">授权文件夹</param>
95 static void CaspolExcelAddInFiles(string filePath)
96 {
97 Process pCaspolCMD = new Process();
98 pCaspolCMD.StartInfo.FileName = "cmd.exe";
99 pCaspolCMD.StartInfo.UseShellExecute = false;
100 pCaspolCMD.StartInfo.RedirectStandardInput = true;
101 pCaspolCMD.StartInfo.RedirectStandardOutput = true;
102 pCaspolCMD.StartInfo.RedirectStandardError = true;
103 pCaspolCMD.StartInfo.WorkingDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727";
104 pCaspolCMD.StartInfo.CreateNoWindow = true;
105 pCaspolCMD.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
106 pCaspolCMD.StartInfo.Arguments = "/K \r\nCaspol -u -ag All_Code -url \"" + filePath + "\\*\" FullTrust -n \"CTPExcelAddIn\"";
107 pCaspolCMD.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
108 pCaspolCMD.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
109 pCaspolCMD.Start();
110 pCaspolCMD.StandardInput.WriteLine("y");
111
112 pCaspolCMD.BeginOutputReadLine();
113 pCaspolCMD.BeginErrorReadLine();
114
115 pCaspolCMD.Close();
116 }
117
118 /// <summary>
119 /// 安装 VSTO 2005 Runtime
120 /// </summary>
121 /// <param name="filePath">安装文件路径</param>
122 static void InstallVSTO2005(string filePath)
123 {
124 string DirectoryName = filePath + "\\Microsoft Visual Studio 2005 Tools for Office Runtime";
125
126 if (System.IO.Directory.Exists(DirectoryName))
127 {
128 Process pVSTO2005 = new Process();
129 pVSTO2005.StartInfo.FileName = DirectoryName + "\\install.exe";
130 pVSTO2005.StartInfo.WorkingDirectory = @"C:\Windows\Microsoft.NET\Framework\v2.0.50727";
131 pVSTO2005.StartInfo.CreateNoWindow = false;
132 pVSTO2005.StartInfo.UseShellExecute = true;
133 pVSTO2005.Start();
134 pVSTO2005.Close();
135
136 sw.WriteLine("成功执行安装 Microsoft Visual Studio 2005 Tools for Office Runtime!");
137 }
138 else
139 {
140 sw.WriteLine("未找到“Microsoft Visual Studio 2005 Tools for Office Runtime”安装目录:" + DirectoryName);
141 }
142 }
143
144 static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
145 {
146 Console.WriteLine(e.Data);
147 }
148
149 }
150 }
151