• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 567
  • Last Modified:

Strange Problem getting Excel Process To Quit`

Hello,

I am working on an application that converts a set of .CSV files to a .XLS workbook.  It does this by opening the first csv with Excel, and then opening each additional .CSV and moving it into the existing workbook.  The problem that I am having is that after the conversion is done, and all Excel objects are released, the Excel process stays running.  Below are some sections of my code.

Excel.Application excelApp = new Excel.Application();

Excel.Workbook workbook;
Excel.Workbooks workbooks;
Excel.Workbooks tempWorkbooks;

workbooks = (Excel.Workbooks)excelApp.Workbooks;
tempWorkbooks = (Excel.Workbooks)excelApp.Workbooks;

// Open the text file in Excel.
workbooks._OpenText(sourcePath, Excel.XlPlatform.xlWindows, 1,
      Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
      false, true, false, false, false, false, missingParameter, missingParameter,
      missingParameter, missingParameter, missingParameter);


workbook = excelApp.Workbooks[1];

for (int i = 2; i <= fileCount; i++)
{
   tempWorkbooks._OpenText(sourcePath + fileBase + i.ToString() + CSVExtension, Excel.XlPlatform.xlWindows, 1,                  Excel.XlTextParsingType.xlDelimited,Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
      false, true, false, false, false, false, missingParameter, missingParameter,missingParameter,  missingParameter,missingParameter);
                              
                                    
//move the opened sheet to the main WB
((Excel.Worksheet)excelApp.Workbooks[2].Worksheets[1]).Move(Type.Missing, excelApp.Workbooks[1].Worksheets[excelApp.Workbooks[1].Worksheets.Count]);
}

I have read several posts and have tried every method for releasing the COM objects.  What is really strange is that everything works fine and the process is killed if I have the above for loop commented out.  This makes it seem like it is a problem in one of 2 the function calls under the for loop, but it will fail regardless of whether the code in the for loop is executed.  For example, if there is only one .csv file, the for loop will not execute, but the process will stay running.  In the same scenario with the loop commented out, the process dies.

?????
Thanks,
Tim
0
Tim_Heldberg
Asked:
Tim_Heldberg
  • 4
  • 2
1 Solution
 
Bob LearnedCommented:
// Tell COM to release resources.
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(tempWorkbooks);

// Force garbage collection
GC.Collect();

Bob
0
 
Bob LearnedCommented:
Oops, almost forgot:

// Close the application
excelApp.Quit();

// Tell COM to release resources.
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(tempWorkbooks);

// Force garbage collection
GC.Collect();

Bob
0
 
Tim_HeldbergAuthor Commented:
I actually did try that.  Here is my COM release code

workbook.Close(false, missingParameter, missingParameter);

excelApp.Quit();
workbooks.Close();

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook) > 0) { }
while(System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks)>0){}
while(System.Runtime.InteropServices.Marshal.ReleaseComObject(tempWorkbooks)>0){}
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp) > 0) { }
                        
GC.Collect();
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
Bob LearnedCommented:
Yeah, didn't notice the remark in the question body.  Sounds like some resource is being still not being released, but I can't see what that would be.  It might be something internal to the _OpenText call.

Bob
0
 
Tim_HeldbergAuthor Commented:
Well, I was able to figure it out, although it really doesnt seem like much of a fix.  I moved that for loop in question to a seperate function and it worked perfectly.  So strange.  Any idea why that would make a difference?
0
 
Bob LearnedCommented:
Which function?  The class destructor?

Bob
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now