Нестабильная автоматизация Office(Powerpoint)
Я работаю над приложением, которое позволит пользователю загрузить презентацию, отредактировать ее, а затем загрузить окончательный результат в виде другой презентации PowerPoint.
У меня очень нестабильное поведение для разных презентаций, которые я загружаю:
Иногда измененные изображения размыты (не знаете почему?)
Иногда возвращаются неправильные идентификаторы формы, и поэтому я не могу объединить измененную работу с существующей формой PowerPoint.
var shape = (PowerPoint.Shape)item; var shapeid=shape.ID; //this is different from what interop has returned on first presentation read.
Анимации не копируются должным образом (иногда они делают, иногда нет).
newshape.AnimationSettings.EntryEffect = oldshape.AnimationSettings.EntryEffect; newshape.AnimationSettings.AdvanceMode=oldshape.AnimationSettings.AdvanceMode; newshape.AnimationSettings.AdvanceTime=oldshape.AnimationSettings.AdvanceTime; newshape.AnimationSettings.AfterEffect=oldshape.AnimationSettings.AfterEffect; newshape.AnimationSettings.Animate=oldshape.AnimationSettings.Animate; newshape.AnimationSettings.AnimateBackground = oldshape.AnimationSettings.AnimateBackground; newshape.AnimationSettings.TextLevelEffect = PowerPoint.PpTextLevelEffect.ppAnimateByAllLevels; newshape.AnimationSettings.AnimateTextInReverse=oldshape.AnimationSettings.AnimateTextInReverse;
Мне известно о том, что автоматизация на стороне сервера может работать нестабильно или зависать. Однако ничто не документирует, что именно нестабильно в поведении
Это поведение (выше двух) в той же категории, или я что-то здесь упускаю? Как я могу исправить эти проблемы?
1 ответ
Если вам все еще нужно использовать Interop, попробуйте освободить COM-объекты и время от времени уничтожать экземпляры PowerPoint, как указано ниже:
public static class PowerPointInterOp
{
static PowerPoint.Application powerPointApp = null;
static Object oMissing = System.Reflection.Missing.Value;
static Object oTrue = true;
static Object oFalse = false;
static Object oCopies = 1;
public static void InitializeInstance()
{
if (powerPointApp == null)
{
powerPointApp = new PowerPoint.ApplicationClass();
}
}
public static void KillInstances()
{
try
{
Process[] processes = Process.GetProcessesByName("POWERPNT");
foreach(Process process in processes)
{
process.Kill();
}
}
catch(Exception)
{
}
}
public static void CloseInstance()
{
if (powerPointApp != null)
{
powerPointApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(powerPointApp);
powerPointApp = null;
}
}
public static PowerPoint.Presentation OpenDocument(string documentPath)
{
InitializeInstance();
PowerPoint.Presentation powerPointDoc = powerPointApp.Presentations.Open(documentPath, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);
return powerPointDoc;
}
public static void CloseDocument(PowerPoint.Presentation powerPointDoc)
{
if (powerPointDoc != null)
{
powerPointDoc.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(powerPointDoc);
powerPointDoc = null;
}
}
}