Объект Microsoft.Interop не будет выходить или «освобождаться» - PullRequest
2 голосов
/ 03 марта 2012

Каждый раз, когда я запускаю этот код, объект не закрывается. У меня все еще есть файл 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 ]

1 голос
/ 03 марта 2012

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

1 голос
/ 03 марта 2012

Когда вы вызываете 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.

0 голосов
/ 03 марта 2012

Я собираюсь предположить, что исключение не выдается, и обработчик 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 в этой среде.

...