2009-12-10 5 views
2

가능한 중복 :
How to properly clean up Excel interop objects in C#Excel이 왜 계속 열려 있습니까?

I했습니다 나는 일부 데이터의 선형 추세 계산하기 위해이 기능을 사용 :

private string Trend(object conocido_y, object conocido_x, object nueva_matriz_x) 
{ 
    string result = String.Empty; 
    try { 
     Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 
     result = ((Array)xlApp.WorksheetFunction.Trend(conocido_y, conocido_x, nueva_matriz_x, true)).GetValue(1).ToString(); 
     xlApp.Quit(); 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); 
     xlApp = null; 
    } 
    catch (System.Runtime.InteropServices.COMException ex) { 
     DError.ReportarError(ex, false); 
    } 
    catch (Exception ex) { 
     DError.ReportarError(ex); 
    } 
    return result; 
} 

결과가 잘되지만를 작업 관리자를 열면 프로세스가 여전히 실행 중입니다. 이유는 무엇입니까?

+0

을하지만 질문자 작동하지 않았기 때문에 "정답은"허용 하나가되지 않습니다 :

는 (이 SO에 많은 시간을 요구하고있다)을 참조하십시오. 그것은 단일 투표조차 가지고 있지 않습니다 (저는 이제 그것을 업 그레 이드하려고합니다). –

답변

8

에 달렸다 사용해보십시오, 그 ReleaseComObject(), 강제 GC 후 통과는 물체가 풀려서 마침내 죽을 때까지 능가합니다.

또한이 코드 조각에는 표시되지 않지만 시트 또는 다른 Excel 개체에서 ReleaseComObject()를 처리해야합니다 (결과가 그렇게됩니까?).

ReleaseComObject(result); 
app.Aplication.Quit(); 
ReleaseComObject(app); 
GC.Collect(); 
+0

@Vinko 감사합니다 Vinko였습니다! – Unlimited071

1

xlApp.Application.Quit(); 

대신

xlApp.Quit(); 

내가 최근에 정확히 같은 문제 : 내가 보았던 기억

+0

@ 존 감사합니다. 나는 당신의 제안을 시도했으나 문제는 여전히 남아있다. – Unlimited071

+1

GC 등을 강요하지 않았습니까? 나는 심지어 Application.Quit()도 충분하지 않다는 것을 기억한다. (나는 여기에 그 코드가 없으므로 착각 할 수도있다.) –

+0

@Vinko : 나는하지 않았지만 .NET 4.0을 사용하고있다. 차이? –

2

함수에 오류가 있습니까? 그렇다면 Quit()에 도달하지 않습니다. finally 블록에 Quit 및 ReleaseComObject를 넣을 수 있습니다.

+0

아마도 이것이 문제를 해결하지 못할지라도 실제로 이것은 좋은 생각입니다. –

+0

예. 질문을 다시 읽었을 때 결과가 좋았으므로 문제가 아닐 수 있습니다. 나는 Excel이 여전히 작업 mgr에 나타나는 것과 동일한 문제가 있습니다. 잠시 후에 그들은 사라지므로 아마도 GC 일 것입니다. – Crispy

+0

@Chris. 어떻게이게 내 마음을 미끄러 뜨릴 수 있니?! 바로 변경하기! 잡은 고마워. – Unlimited071

0

Excel은 COM 자동화 서버입니다.

Application.Quit()를 호출하고 참조를 COM 개체에 릴리스해도 exe 자체는 종료되지 않습니다. 작업 관리자에서 계속 볼 수 있습니다. Excel을 추가로 호출하면 실행중인 인스턴스가 사용됩니다.

응용 프로그램 (스레드, 세션 등)이 닫히면 Excel 인스턴스가 종료됩니다.

"RPC 서버를 찾을 수 없음/실행 중"형식의 COM 오류가 발생 했습니까? 이제 그 이유를 알았습니다.

c# and excel automation - ending the running instance

+0

a) GC.Collect가 왜 그것을 (신뢰성 있고 재현성있게) 종료합니까? b) "RPC 서버를 찾을 수 없음/실행 중"이이 작업과 관련이 있습니까? –

+0

a. 왜 그럴까? 비. Excel과 같은 COM 서버에 적용 할 수있는 흥미로운 정보입니다. 이 오류는 Excel을 닫은 후 Excel에 대한 참조를 해제 한 후 추가로 호출하는 것이 었습니다. –

+0

a) 저는 응용 프로그램을 종료하지 않고 GC-ing을하면, 스레드 또는 응용 프로그램이 끝난 후에 만 ​​가능한 Excel 인스턴스가 종료된다고 말하고 있습니다. b) 좋습니다. –

관련 문제