1

「古い」.Net-3.5-Project を .Net-4.0 に変換しようとしています。今ではすべて正常に動作しますが、Excel-Interop.

私が問題を抱えているのは、ワークブックを開くことです。私はすでにまったく新しいプロジェクトを試し、.Net-3.5 で 1 回、.Net-4.0 で 1 回コンパイルしました。「古い」フレームワークでは期待どおりに動作しますが、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 のみが含まれており、上記の動作を持つボタンを 1 つだけ追加しました。

ここに欠けているものはありますか?4.0 で Excel を操作する方法に何か変更はありましたか?

更新:質問に答えるには:

  • Windows 7 Enterprise (x64) 上の Office 2010 (x86) です。
  • Visual Studioの「参照」に追加し、メインクラスで「使用」と呼びました。(完全に表示するようにコードを更新します)
  • これが動作を示すための実際の最小限のコードになりました - 奇妙ですね。

更新 2: 私はいくつかの「新しい」ものを見つけました:

  • Windows XP (x86) でも発生しています。
  • Excel.Interop が参照されているプロジェクトを .net4 で持つ必要はありません。何らかの .net4-project から呼び出されれば十分です。例:

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 にこの違いがあるのはなぜですか、またはどこかに文書化されていますか? そして、それを回避する方法は?

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

したがって、これは私の以前のロジックの回避策です。

これは、4 ではなく 3.5 で機能する理由の説明ではなく、実際に問題を解決しないため、私自身の回答を解決策として受け入れるつもりはありません。

将来の検索/他の人の問題については、このスレッドが役立つ可能性があるため、ここで開いたままにします. 誰かが動作の説明を見つけた場合、私はそれを答えとして喜んで受け入れます:)

于 2012-05-07T12:30:17.340 に答える