公共variables的参考迷失在C#

在我的class级里,我正在宣布

public Excel.Range range { get; set; } 

该类的构造函数调用此方法:

 private void OpenWorkBook() { string str; int rCnt = 0; int cCnt = 0; xlApp = new Excel.ApplicationClass(); xlWorkBook = xlApp.Workbooks.Open(MasterFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); range = xlWorkSheet.UsedRange; } 

之后,当我参考不同的方法range

 public void CreateFiles(string column) { try { var valueRange = range.get_Range(column + "3", column + range.Rows.Count.ToString()); var deleteRange = range; 

我正进入(状态:

 valueRange threw an exception of type System.Runtime.InteropServices.InvalidComObjectException' 

有谁知道为什么我失去了这个variables的内容?

这是我的完整代码:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; using System.Runtime.Serialization; namespace EmailSalesVolumeSolution { class WorkBook { public string MasterFileName { get; set; } public string[] DistinctEmails { get; set; } public Excel.Application xlApp {get;set;} public Excel.Workbook xlWorkBook { get; set; } public Excel.Worksheet xlWorkSheet { get; set; } public Excel.Range range { get; set; } private void OpenWorkBook() { string str; int rCnt = 0; int cCnt = 0; xlApp = new Excel.ApplicationClass(); xlWorkBook = xlApp.Workbooks.Open(MasterFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); range = xlWorkSheet.UsedRange; } public WorkBook(string filename) { MasterFileName = filename; //xlWorkBook = null; //xlApp = null; //xlWorkSheet = null; //range = null; OpenWorkBook(); } public void SendEmail() { } public void CreateFiles(string column) { try { var valueRange = range.get_Range(column + "3", column + range.Rows.Count.ToString()); var deleteRange = range; string cell = ""; DistinctEmails = DistinctValues(valueRange); foreach (string email in DistinctEmails) { for (int rCnt = 2; rCnt <= valueRange.Rows.Count; rCnt++) { cell = (string)(valueRange.Cells[rCnt, 1] as Excel.Range).Value2; if (cell == null || cell != email) { deleteRange=xlWorkSheet.get_Range(column + rCnt.ToString() + ":" + column + rCnt.ToString(), Type.Missing); deleteRange.Delete(Excel.XlDeleteShiftDirection.xlShiftUp); } } xlWorkBook.SaveAs(xlWorkBook.Path + @"\" + email, Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); } } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { //DisposeMe(); // Release all COM RCWs. // The "releaseObject" will just "do nothing" if null is passed, // so no need to check to find out which need to be released. // The "finally" is run in all cases, even if there was an exception // in the "try". // Note: passing "by ref" so afterwords "xlWorkSheet" will // evaluate to null. See "releaseObject". releaseObject( xlWorkSheet); releaseObject( xlWorkBook); // The Quit is done in the finally because we always // want to quit. It is no different than releasing RCWs. if (xlApp != null) { xlApp.Quit(); } releaseObject( xlApp); } } private string[] DistinctValues(Excel.Range EmailList) { string cell = ""; List<string> emails = new List<string>(); for (int rCnt = 1; rCnt <= EmailList.Rows.Count; rCnt++) { cell = (string)(EmailList.Cells[ rCnt,1] as Excel.Range).Value2; if (cell!=null) emails.Add(cell.ToString()); } releaseObject(EmailList); return emails.Distinct().ToArray(); } private void releaseObject( object obj) // note ref! { // Do not catch an exception from this. // You may want to remove these guards depending on // what you think the semantics should be. if (obj != null && Marshal.IsComObject(obj)) { Marshal.ReleaseComObject(obj); } // Since passed "by ref" this assingment will be useful // (It was not useful in the original, and neither was the // GC.Collect.) obj = null; } private void DisposeMe() { // Cleanup: GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.FinalReleaseComObject(xlWorkSheet); xlWorkBook.Close(false, Type.Missing, Type.Missing); Marshal.FinalReleaseComObject(xlWorkBook); xlApp.Quit(); Marshal.FinalReleaseComObject(xlApp); } } } 

这里是我如何实例化类!

 private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog. if (result == DialogResult.OK) // Test result. InitializeWorkBook(openFileDialog1.FileName); } private void InitializeWorkBook(string filename) { WorkBook wb= new WorkBook(filename); wb.CreateFiles("A"); }