我正在尝试将“旧”.Net-3.5-Project 转换为 .Net-4.0。现在一切正常,但 Excel 互操作。
我遇到的问题是打开工作簿。我已经尝试了一个全新的项目,并用 .Net-3.5 编译过一次,用 .Net-4.0 编译过一次。使用“旧”框架,它可以按预期工作,但是使用 4.0 我只能得到null
结果?
我的 testapp 中的代码是这样的:
using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Excel.Workbook test;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenWithInterop();
}
private void OpenWithInterop()
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(excel_WorkbookOpen);
test = excel.Workbooks.Open(@"C:/Test/test.xlsx");
excel.Quit();
}
void excel_WorkbookOpen(Excel.Workbook Wb)
{
if (test.Name.Equals(Wb.Name)) // Here there will be an null-exception with .net-4 but not with .net-3.5
{
Console.WriteLine("done it right");
}
}
}
}
testapp 只包含一个 WinForm-Form(来自模板),我只添加了一个具有上述行为的按钮。
我在这里有什么遗漏吗?在 4.0 中使用 Excel 的方式有什么变化吗?
更新:回答您的问题:
- 它是 Windows 7 Enterprise (x64) 上的 Office 2010 (x86)
- 我只是将它添加到 Visual Studio 的“引用”中,并在我的主类中将其称为“使用”。(将更新我的代码以显示完整)
- 现在,这是向您展示行为的真正最小代码 - 不是很奇怪吗?
更新2: 我发现了一些“新”的东西:
- 它也发生在 Windows XP (x86) 上
- 您不需要在 .net4 中拥有引用 Excel.Interop 的项目,它被某些 .net4-project 调用就足够了。例子:
BaseProject (.net-4) --> DataLayer (.net-3.5) 参考 Excel.Interop --> Presentation (.net-4)
在此示例中,将发生错误。即使 DataLayer 是 .net-3.5。BaseProject 必须是 .net-4,因为它调用的是 .net-4 的 Presentation(并且需要......)
更新 3:
刚刚发现,一切都会正常工作,但是如果您将其中之一用于 .net4 中的事件,您会遇到麻烦
excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed);
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen);
Excel._Application
like in 中是否有任何等效事件Excel.ApplicationClass
?
更新 4:
为了回答评论的问题(谢谢威尔!)我稍微扩展了这个例子。主要问题在于事件。为什么 .net-4 中存在这种差异或在某处有记录?以及如何避免?