programing

왜 마이크로소프트가.사무실. 인터럽트.Excel. 지원서.종료() 백그라운드 프로세스를 실행 상태로 두시겠습니까?

lovejava 2023. 7. 8. 10:25

왜 마이크로소프트가.사무실. 인터럽트.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