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