Чтобы проиллюстрировать проблему, у меня есть этот пример кода в «C:\myPowerPointHangs» для C# Windows Forms .NET
Я добавил из Диспетчера ссылок>COM>Библиотеки типов ссылку на сборку «Библиотека объектов Microsoft Office 16.0» (версия 2.8) или также из NuGet: «Microsoft.Office.Interop.PowerPoint» (версия 15.0.4420.1018) добавлен в мой проект...
Я создал два таймера.
- Таймер1 покажет подсчет шагов за 100 мс в заголовке моей WinForm и запустит Таймер2 в 2000 миллисекунды, затем продолжайте отсчет.
- Таймер2 срабатывает один раз. Он создает слайд и матрицу блоков. Это занимает несколько секунд. Наконец, он сохраняет презентацию. После этого моя WinForm снова жива.
Код: Выделить всё
// Project>Add Reference>COM>Type Libraries>Microsoft Office 16.0 Object Library
// Tools>NuGet Package Manager>Manage NuGet Packages for solution>Microsoft.Office.Interop.PowerPoint 15.0.4420.1018
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;
using State = Microsoft.Office.Core.MsoTriState;
using System;
using System.Windows.Forms;
namespace myPowerPointHangs
{
public partial class Form1 : Form
{
readonly float u = 72.0f; // Inches
int t = 0;
int t0 { get => (++t); set => t = 0; }
string fileName = @"C:\myPowerPointHangs\mySlides.ppt";
public Form1() { InitializeComponent(); timer1.Start(); }
private void timer1_Tick(object sender, EventArgs e)
{
this.Text = t0.ToString() + "00ms";
if (t == 20) timer2.Start();
}
private void timer2_Tick(object sender, EventArgs e)
{
timer2.Stop();
PowerPoint.Application pptApplication = new PowerPoint.Application();
PowerPoint.Presentation ppt;
PowerPoint.Slide slide;
PowerPoint.Slides slides;
Office.MsoAutoShapeType shape;
ppt = pptApplication.Presentations.Add(State.msoTrue);
slides = ppt.Slides;
slides.Application.Caption = "mySlides";
slide = slides.Add(1, PowerPoint.PpSlideLayout.ppLayoutBlank);
shape = Office.MsoAutoShapeType.msoShapeFlowchartTerminator;
float left = 6.61f * u;
for (int col = 0; col < 5; col++)
{
float top = 0.1f * u;
for (int row = 0; row < 20; row++)
{
slide.Shapes.AddShape(shape, left, top, 0.77f * u, 0.23f * u);
int i = slide.Shapes.Count;
slide.Shapes[i].Fill.ForeColor.RGB = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.White);
slide.Shapes[i].Line.ForeColor.RGB = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.FromArgb(58, 58, 58));
slide.Shapes[i].TextFrame.TextRange.Font.Color.RGB = System.Drawing.ColorTranslator.ToWin32(System.Drawing.Color.FromArgb(19, 40, 79));
slide.Shapes[i].TextFrame.TextRange.Font.Size = 6.0f;
slide.Shapes[i].TextFrame.WordWrap = State.msoFalse;
slide.Shapes[i].TextFrame.TextRange.Text = col.ToString("00")+row.ToString("00");
top += slide.Shapes[i].Height + 0.02f * u;
}
left += slide.Shapes[slide.Shapes.Count].Width + 0.05f * u;
}
if (System.IO.File.Exists(fileName)) System.IO.File.Delete(fileName);
ppt.SaveAs(fileName, PowerPoint.PpSaveAsFileType.ppSaveAsPresentation, Office.MsoTriState.msoCTrue);
ppt.Close();
}
}
}
Кроме того, если по какой-либо причине мы откроем всплывающее сообщение в приложении PowerPoint до или во время создания презентации, будет сгенерировано исключение:
Код: Выделить всё
System.Runtime.InteropServices.COMException: 'Call was rejected by callee. (Exception from HRESULT: 0x80010001
Подробнее здесь: https://stackoverflow.com/questions/792 ... -powerpoin