abdul subhan mohammed Ответов: 1

Не удалось закрыть приложения PowerPoint с помощью офиса-взаимодействие с#


Дорогие Все,

Мы автоматизируем MsOffice в приложении winform (C#).

В настоящее время мы работаем над тем, чтобы создать файл powerpoint(программно). Мы успешно создали pptx-файл.

После создания pptx-файла мы пытаемся закрыть как презентацию, так и приложение. Его clsoing только презентация, но не приложение ppt.

Mycode в

Что я уже пробовал:

private static void QuitApplication(PowerPointInterop.Application powerPointApplication)
        {
            if (powerPointApplication != null)
            {
                try
                {
                    powerPointApplication.DisplayAlerts = PowerPointInterop.PpAlertLevel.ppAlertsNone;
                    powerPointApplication.Visible = Microsoft.Office.Core.MsoTriState.msoFalse;
                    powerPointApplication.Quit();

                    Marshal.FinalReleaseComObject(powerPointApplication.Presentations);
                    Marshal.FinalReleaseComObject(powerPointApplication);

                    powerPointApplication = null;

                    GC.Collect();
                    GC.WaitForPendingFinalizers();

                    // GC needs to be called twice in order to get the Finalizers called  
                    // - the first time in, it simply makes a list of what is to be  
                    // finalized, the second time in, it actually is finalizing. Only  
                    // then will the object do its automatic ReleaseComObject.
                    GC.Collect();
                }
                catch (Exception)
                {
                    //Ignore
                }
            }
        }


public static bool CreateNewFile(IQuestion question, string filename)
        {
            WinUtil.DeleteFile(filename);
            if (File.Exists(filename))
                return false;

            PowerPointInterop.Application powerpointApplication = null;
            try
            {
                //Avoid screen flickering or unwanted alerts while initializing
                powerpointApplication = new PowerPointInterop.Application();

                // Create the Presentation File
                PowerPointInterop.Presentation pptPresentation = powerpointApplication.Presentations.Add(MsoTriState.msoTrue);               

                pptPresentation.SaveAs(filename, PowerPointInterop.PpSaveAsFileType.ppSaveAsDefault, MsoTriState.msoTriStateMixed);

                pptPresentation.Close();
                powerpointApplication.Quit();

                return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                QuitApplication(powerpointApplication);
            }
        }


Ссылка: Приложение Office C# автоматизирует образец PowerPoint (CSAutomatePowerPoint) на языке C# для Visual Studio 2010[^]

кто-нибудь может пожалуйста помочь мне.

Спасибо

CHill60

Удалите блоки try-catch, чтобы вы могли определить, возникает ли исключение

abdul subhan mohammed

Я попытался удалить блок try-catch, но никаких исключений не возникло.

Michael_Davies

Всякий раз, когда я использую ComObject, я нахожу, что должен зацикливаться до тех пор, пока релиз не вернет ноль, никогда не использовал final, так что не уверен, есть ли разница, но один вызов не всегда освобождает COM-ссылку;

В То Время Как Система.Во время выполнения.InteropServices.Маршал.ReleaseComObject (Excel) < & gt; 0
Приложение.Функция doevents()
Конец Пока

Barry_Sharp

Так же, как и FYI, вы могли бы подумать о том, чтобы избежать хлопот, связанных с COM-интерфейсом, используя чистое решение C#. Например, вы можете проверить это Библиотека PowerPoint на языке C# для презентаций Например, вот как вы создадите с его помощью новую презентацию:

Презентация метод presentationdocument = новый метод presentationdocument();
презентация.Сохранить("empty-presentation.pptx");

1 Ответов

Рейтинг:
1

Maciej Los

Я бы посоветовал прочитать это: Приложение Office не завершается после автоматизации из Visual Studio .Чистый клиент[^]
Вы должны "очистить" с помощью Маршал.ReleaseComObject Метод (Объект) (System.Runtime.InteropServices)[^] непосредственно на вашем объекте приложения ppt (экземпляре).