首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打开使用.Net3.5,但不使用.Net4

打开使用.Net3.5,但不使用.Net4
EN

Stack Overflow用户
提问于 2012-05-04 06:33:20
回答 1查看 1.6K关注 0票数 1

我正在尝试将一个“旧”.NET 3.5-Project转换为..Net 4.0。到目前为止,一切正常,但是Excel。

我遇到的问题是打开一本工作簿。我已经尝试了一个全新的项目,并用.NET 3.5编译了一次,用.NET 4.0编译了一次。对于“旧”框架,它的工作方式是切除的,但是在4.0中,我只能得到null吗?

我在测试应用程序中的代码是:

代码语言:javascript
复制
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工作方式有什么变化吗?

更新:回答您的问题:

  • it 's Office 2010 (x86) on Windows7Enterprise(X64)
  • 我刚刚在Visual中将其添加到"references“中,并在我的主类中将其称为”使用“。(将更新我的代码以显示完整)
  • 现在是向您展示行为的真正的最小代码,不是吗?

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

  • --它也发生在Windows (X86)
  • 上,您不需要在该项目中引用Excel.Interop,在.net4中,只需要一些.NET 4-项目调用它就足够了。例子:

BaseProject (..net 4)-> DataLayer (..net 3.5)参考Excel.Interop ->演示文稿(..net 4)

在本例中,将发生错误。即使DataLayer是.NET 3.5。BaseProject必须是..net 4,因为它调用的是..net 4(而且必须是.)

更新3:

刚刚发现,一切都会很好,但是如果您将其中一个用于.net4中的事件,则会遇到真正的麻烦。

代码语言:javascript
复制
excel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(this.HandleWorkbookClosed);
excel.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(this.HandleWorkbookOpen);

Excel._Application中是否有类似于Excel.ApplicationClass的等价物事件?

更新4:

回答评论的问题(谢谢!)我把这个例子做了一点扩展。主要的问题是在事件中。为什么.net-4中存在这种差异,或者在某个地方有文档记录?如何避免呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-07 12:30:17

我现在有一种解决办法:

我将我的2个事件处理程序从

代码语言:javascript
复制
    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");
        }
    }

改变了的逻辑

代码语言:javascript
复制
    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,它实际上不能解决问题,我不愿意接受我自己的答案作为解决方案。

对于其他人将来的搜索/问题,这个线程可能会有帮助,所以我会让它在这里打开。如果有人为这种行为找到了解释,我绝对愿意接受它作为一个答案:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10443850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档