왜 마이크로소프트가.사무실. 인터럽트.Excel. 지원서.종료() 백그라운드 프로세스를 실행 상태로 두시겠습니까?
다음 코드는 프로그램이 종료될 때까지 Microsoft Excel 백그라운드 프로세스를 실행합니다.
var excelApplication = new Application();
var workbooks = excelApplication.Workbooks;
var workbook = excelApplication.Workbooks.Open(file.FullName);
workbook.Close();
excelApplication.Workbooks.Close();
excelApplication.Quit();
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApplication);
왜요? 제가 뭘 놓쳤죠?
알았다!
어플.워크북!= 애플리케이션.워크북
이 속성은 변수를 노출하지 않고 값을 생성합니다.따라서 Workbooks 속성에 액세스할 때마다 새 COM 개체를 만듭니다.
제가 코드를 고쳤는데 다 괜찮아요.감사합니다, 여러분.
var excelApplication = new Application();
var workbooks = excelApplication.Workbooks;
var workbook = workbooks.Open(pathToExcelWorkbook); // Fixed
workbook.Close();
workbooks.Close();
excelApplication.Quit();
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(excelApplication);
이것은 Office 응용프로그램에 널리 퍼져 있는 문제입니다.모든 Excel 추가/자동화 응용 프로그램은 더 이상 필요하지 않을 때 Excel 개체에 대한 참조를 체계적으로 릴리스해야 합니다.Excel 개체에 대한 참조를 체계적으로 릴리스하지 않으면 Microsoft Office Excel이 제대로 종료되지 않을 수 있습니다.자세한 내용은 체계적으로 개체 해제를 참조하십시오.Outlook과 관련이 있지만 모든 Office 응용프로그램에 동일한 원칙을 적용할 수 있습니다.
시스템을 사용합니다.런타임.Interop Services.보안관님사용을 마치면 ComObject를 릴리스하여 Excel 개체를 릴리스합니다.그런 다음 Visual Basic(C#의 null)에서 변수를 Nothing(없음)으로 설정하여 개체에 대한 참조를 해제합니다.
이렇게 하는 것은 잘못된 방법이지만 문제를 해결하는 가장 쉬운 방법은 다음과 같습니다.
[DllImport("user32.dll")]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
private Application _excelApp;
private Workbook _excelWorkBook;
private Worksheet _excelSheet;
private void CloseExcelApp()
{
int hWnd = _excelApp.Application.Hwnd;
uint processID;
GetWindowThreadProcessId((IntPtr)hWnd, out processID);
Process.GetProcessById((int)processID).Kill();
_excelWorkBook = null;
_excelApp = null;
_excelSheet = null;
}
초기화되지 않은 변수를 모두 초기화하고 앱을 닫아야 할 때 CloseExcelApp()을 호출하기만 하면 됩니다.
언급URL : https://stackoverflow.com/questions/27930307/why-does-microsoft-office-interop-excel-application-quit-leave-the-background
'programing' 카테고리의 다른 글
스프링 부트에서 조건부로 오토와이어를 사용하는 방법은 무엇입니까? (0) | 2023.07.08 |
---|---|
배열이 비어 있는지 확인(vba excel) (0) | 2023.07.08 |
WPF MouseLeftButtonDown 이벤트 핸들러의 Ctrl 키 누름 조건 (0) | 2023.07.08 |
VBA: Excel에서 필터링된 행을 삭제하는 방법은 무엇입니까? (0) | 2023.07.08 |
Python 중첩 함수 변수 범위 지정 (0) | 2023.07.08 |