1

我正在尝试将“旧”.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._Applicationlike in 中是否有任何等效事件Excel.ApplicationClass

更新 4:

为了回答评论的问题(谢谢威尔!)我稍微扩展了这个例子。主要问题在于事件。为什么 .net-4 中存在这种差异或在某处有记录?以及如何避免?

4

1 回答 1

0

我现在有一种解决方案:

我将我的 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,它实际上并不能解决问题,所以我不愿意接受我自己的答案作为解决方案。

For future searches / problems of other people this thread might be helpful, so I will let it stay here open. If someone finds a explanation for the behaviour I would be absolute willing to accept it as an answer :)

于 2012-05-07T12:30:17.340 回答