我正在尝试将一个“旧”.NET 3.5-Project转换为..Net 4.0。到目前为止,一切正常,但是Excel。
我遇到的问题是打开一本工作簿。我已经尝试了一个全新的项目,并用.NET 3.5编译了一次,用.NET 4.0编译了一次。对于“旧”框架,它的工作方式是切除的,但是在4.0中,我只能得到null吗?
我在测试应用程序中的代码是:
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表单(来自模板),我只添加了一个按钮,该按钮具有上述行为。
这里有我遗漏的东西吗?4.0版的Excel工作方式有什么变化吗?
更新:回答您的问题:
更新2:我发现了一些“新”的东西:
BaseProject (..net 4)-> DataLayer (..net 3.5)参考Excel.Interop ->演示文稿(..net 4)
在本例中,将发生错误。即使DataLayer是.NET 3.5。BaseProject必须是..net 4,因为它调用的是..net 4(而且必须是.)
更新3:
刚刚发现,一切都会很好,但是如果您将其中一个用于.net4中的事件,则会遇到真正的麻烦。
excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed);
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen);Excel._Application中是否有类似于Excel.ApplicationClass的等价物事件?
更新4:
回答评论的问题(谢谢!)我把这个例子做了一点扩展。主要的问题是在事件中。为什么.net-4中存在这种差异,或者在某个地方有文档记录?如何避免呢?
发布于 2012-05-07 12:30:17
我现在有一种解决办法:
我将我的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,它实际上不能解决问题,我不愿意接受我自己的答案作为解决方案。
对于其他人将来的搜索/问题,这个线程可能会有帮助,所以我会让它在这里打开。如果有人为这种行为找到了解释,我绝对愿意接受它作为一个答案:)
https://stackoverflow.com/questions/10443850
复制相似问题