Объект Microsoft.Interop не будет завершен или "отпущен"

Каждый раз, когда я запускаю этот код, объект не закрывается. У меня все еще есть файл excel.exe, запущенный в диспетчере задач. Даже если я установлю объекты = ноль, все равно ничего. Я даже пытался использовать объект.Quit() метод.

Что я здесь не так делаю?

    private bool ValidateQM()
    {
        //setup the objects
        Excel.Application oXL = null;
        Excel.Workbook oWB = null;
        Excel.Worksheet oSheet = null;
        int hWnd = 0;

        try
        {

            //Start Excel and get Application object.
            oXL = new Excel.Application();
            hWnd = oXL.Application.Hwnd;
            oXL.Visible = false;

            //Open the workbook.
            oWB = oXL.Workbooks.Open(workingForm, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",true, false, 0, true, false, false);

            //Get the Worksheet
            oSheet = oWB.Worksheets[1];

            //Check the date values

            string mydatetime = oSheet.Cells[5, 33].Text.ToString() + " " + oSheet.Cells[7, 33].Text.ToString();
            string dateofscore = oSheet.Cells[3, 12].Text.ToString();

            DateTime.Parse(mydatetime); //make my string a real boy
            DateTime.Parse(dateofscore);

            // Cleanup 
            GC.Collect();
            GC.WaitForPendingFinalizers();

            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oSheet);

            //oWB.Close();
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oWB);

            //oXL.Quit();
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oXL);

            return true;
        }

3 ответа

Разве вы не нарушаете правила "не используйте 2 точки" в строке? hWnd = oXL.Application.Hwnd ? Видите библиотеки взаимодействия Excel, несовместимые с ASP.NET? подробнее об этом.

Когда вы вызываете GC.Collect(), объекты oXL и oWB по-прежнему находятся в области видимости, поэтому для них есть активная ссылка. В результате GC.Collect () не будет их трогать. Если вы хотите убедиться, что они являются сборщиком мусора, установите для них значение null, чтобы при вызове GC.Collect () не было активных ссылок. Кроме того, вы можете вызвать Close() в активной книге и Quit() в приложении Excel. Вы также можете поместить все в свою область видимости с помощью фигурных скобок { }, чтобы все это вместе вышло из области видимости.

        // Cleanup 
        oWB.Close(false);
        oWB = null;
        oXL.Quit();
        oXL = null;
        hWnd = null;
#if (DEBUG_SPEED_UP_GC)
        GC.Collect();
        GC.WaitForPendingFinalizers();
#endif

Редактировать: Обратите внимание, что вызов вызова сборки мусора вручную - плохая идея. Я предполагаю, что вы делаете это только в целях отладки, чтобы ускорить работу GC, поэтому я добавил #if.

Я собираюсь предположить, что исключение не выбрасывается и catch обработчик, который вы не показываете, не делает ничего плохого для целей вашей проблемы.

Я даже пытался использовать объект Quit метод

Если нет каких-либо задокументированных советов против этого, я не понимаю, почему вы не всегда звоните Quit чтобы указать, что вы закончили с заявкой.

//Start Excel and get Application object. oXL = new
Excel.Application();
hWnd = oXL.Application.Hwnd;
oXL.Visible = false;

Не имеет значения, что вы меняете видимость окна, которым вы не владеете, что произойдет, если Excel при выходе закроет окно с предупреждением? настройка Visible в false в родительском окне он будет скрыт от пользователя.

В целях отладки старайтесь не скрывать окно.

Здесь есть некоторая информация о том, что вы можете сделать, чтобы Excel не выдавал предупреждения, которые в противном случае потребовали бы интерактивного внимания. Основная суть этого:

DisplayAlerts = false
AskToUpdateLinks = false
AlertBeforeOverwriting = false
Interactive = false
Visible = false
FeatureInstall = 0 'msoFeatureInstallNone

Вы запускаете приложение в интерактивном сеансе пользователя, верно? Потому что все остальное не поддерживается:

В настоящее время Microsoft не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых необслуживаемых, неинтерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и / или или тупик, когда Office работает в этой среде.

Другие вопросы по тегам