打开Excel-Workbook可以使用.Net3.5,但不能使用.Net4

我正在尝试将“旧”.net-3.5-Project转换为.Net-4.0。 现在一切正常,但Excel-Interop。

我遇到的问题是打开工作簿。 我已经尝试了一个全新的项目,并使用.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(来自模板),我只添加了一个具有上述行为的button。

有什么我在这里失踪? 在4.0中使用Excel的方式有什么变化吗?

更新:回答你的问题:

  • 它是Windows 7 Enterprise(x64)上的Office 2010(x86)
  • 我只是将它添加到Visual Studio中的“引用”中,并在我的Main-Class中将其称为“using”。 (将更新我的代码,以显示它已满)
  • 现在,这是真正的最小代码来显示你的行为 – 奇怪是不是?

更新2:我发现了一些“新”的东西:

  • 它也发生在Windows XP(x86)上
  • 您不需要在.net4中引用Excel.Interop所引用的项目,这足以由某个.net4-project调用。 例:

BaseProject(.net-4) – > DataLayer(.net-3.5)引用Excel.Interop – >演示文稿(.net-4)

在这个例子中,错误将会发生。 即使DataLayer是.net-3.5。 BaseProject必须是.net-4,因为它正在调用Presentation .net-4(并且需要…)

更新3:

刚刚发现,一切都可以正常工作,但是如果您在.net4中使用其中的一种事件,则会非常麻烦

 excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed); excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen); 

Excel.ApplicationClass是否有任何类似于Excel的事件?

更新4:

回答评论的问题(谢谢Will!),我稍微扩展了这个例子。 主要问题在于事件。 为什么.net-4中存在这种差异,或者是有logging的地方? 而如何避免呢?

现在我有一种解决scheme:

我改变了我的2个事件处理程序

  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"); } } 

到这个变化的逻辑

  void excel_WorkbookOpen(Excel.Workbook wb) { if (!wb.FullName.Equals(pathToExcelFile)) // pathToExcelFile is class-wide visible { return; } Console.WriteLine("done it right"); } 

所以这是我以前的逻辑的解决方法。

因为这不是解释为什么它适用于3.5,而不是4,它实际上不解决问题,我不愿意接受我自己的答案作为解决scheme。

对于未来的search/其他人的问题,这个线程可能会有所帮助,所以我会让它留在这里打开。 如果有人发现行为的解释,我会绝对愿意接受它作为回答:)