【发布时间】:2009-10-03 17:42:35
【问题描述】:
当我在 Windows 应用程序中使用以下代码时,它总是会触发 WOrkBookOpen 事件。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Microsoft.Office.Interop.Excel.Application app;
private void button1_Click(object sender, EventArgs e)
{
app = new Microsoft.Office.Interop.Excel.Application();
app.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(app_WorkbookOpen);
app.WorkbookActivate += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookActivateEventHandler(app_WorkbookActivate);
}
void app_WorkbookActivate(Microsoft.Office.Interop.Excel.Workbook Wb)
{
MessageBox.Show(Wb.FullName);
}
void app_WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook Wb)
{
MessageBox.Show(Wb.FullName);
}
private void button2_Click(object sender, EventArgs e)
{
app.Quit();
Marshal.FinalReleaseComObject(app);
}
}
但是当我想使用 Windows 服务触发相同的事件时,它不会触发。下面是用于服务的代码。我在服务的 OnStart() 中创建 Excel 互操作对象并附加相同的事件。但安装服务后,此事件不会触发。而在同一个Windows应用程序中它会启动。出于测试目的,我在磁盘上创建 FIle 以检查事件是否正在触发。
public partial class Service1 : ServiceBase
{
Microsoft.Office.Interop.Excel.Application excel;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
File.Create("C:\\SampleService\\Start - " + DateTime.Now.Ticks.ToString());
excel = new Microsoft.Office.Interop.Excel.Application();
excel.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(excel_WorkbookOpen);
excel.WorkbookActivate += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookActivateEventHandler(excel_WorkbookActivate);
File.Create("C:\\SampleService\\Start - " + DateTime.Now.Ticks.ToString());
}
catch (Exception e)
{
using (StreamWriter stream = new StreamWriter(@"C:\SampleService\Err.txt", true))
{
stream.Write(e.Message);
}
}
}
void excel_WorkbookActivate(Microsoft.Office.Interop.Excel.Workbook Wb)
{
File.Create("C:\\SampleService\\EXCEL - " + DateTime.Now.Ticks.ToString());
}
public void excel_WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook Wb)
{
File.Create("C:\\SampleService\\EXCEL - " + DateTime.Now.Ticks.ToString());
}
protected override void OnStop()
{
if (excel != null)
{
excel.Quit();
Marshal.FinalReleaseComObject(excel);
}
}
}
我也使用了 serviceInstaller,我正在机器上安装服务。我授予服务以创建 Excel.Application com 组件对象的适当权利。
有人遇到过这样的问题吗?还是你发现我遗漏了什么?
谢谢 帕雷什
【问题讨论】:
-
我读过 divo 的 cmets。如果我可以建议,您可以创建一个 excel 插件来做同样的事情吗?这是一个更好的选择吗?