Microsoft.Office.Interop.PowerPoint.dll PowerPoint CustomDocumentProperties большая проблема - PullRequest
3 голосов
/ 21 июля 2010

У меня есть приложение, которое может экспортировать слайды в PowerPoint.Я использую Microsoft.Office.Interop.PowerPoint.dll.Это 11 версия сборки.Я запустил приложение сегодня, и кажется, что приложение выдает исключение (исключение из HRESULT: 0x80070057 (E_INVALIDARG)).Это исключение выдается только тогда, когда в системе открыто приложение powerpoint, прежде чем я нажимаю кнопку экспорта.Я добавляю пользовательское свойство в CustomDocumentProperties презентации Powerpoint, чтобы определить, какая презентация была создана приложением.Это первый раз, когда я увидел это исключение.У меня Windows 7 Ultimate x64 sytem с Visual Studio 2008 и 2010 и, конечно, Office 2007.

Часть кода, которая вызывает исключение:

oDocAuthorProp = typeDocBuiltInProps.InvokeMember("Item",
                                                   BindingFlags.Default |
                                                   BindingFlags.GetProperty,
                                                   null, oDocBuiltInProps,
                                                   new object[] { strIndex });

Что не так?Я следовал этой статье Microsoft: http://support.microsoft.com/kb/303296

Уже более года Приложение работает без каких-либо проблем.Что идет не так?После 10 часов, потраченных на поиск в Интернете ответа, от которого я отказываюсь.

вот код метода Export2Powerpoint:

public static void Export(List<ChartObject> chartObjects)

{
    Application ppApp = new Application();


    foreach (ChartObject chartObject in chartObjects)
    {
        chartObject.Chart.BorderLineStyle = ChartDashStyle.NotSet;
    }

    Presentation ppPress = null;

    int i;
    object oDocBuiltInProps;

    string strValue = string.Empty;

    if(ppApp.Presentations.Count == 0)
    {
        ppPress = AddPresentation(ppApp, ppPress);
    }
    else
    {
        i = 0;


        object oDocAuthorProp = null;

        foreach (Presentation presentation in ppApp.Presentations)
        {
            oDocBuiltInProps = presentation.CustomDocumentProperties;
            Type typeDocBuiltInProps = oDocBuiltInProps.GetType();

            string strIndex = "Browser";


            try{


                oDocAuthorProp = typeDocBuiltInProps.InvokeMember("Item",
                                           BindingFlags.Default |
                                           BindingFlags.GetProperty,
                                           null, oDocBuiltInProps,
                                           new object[] { strIndex }); ======>> here is the line that generates the exception
            }
            catch(Exception e)
            {
                //ErrorHandling.LogErrorToFile(e.Message, e.StackTrace);
            }
            if (oDocAuthorProp != null)
            {
                Type typeDocAuthorProp = oDocAuthorProp.GetType();
                strValue = typeDocAuthorProp.InvokeMember("Value",
                                                          BindingFlags.Default |
                                                          BindingFlags.GetProperty,
                                                          null, oDocAuthorProp,
                                                          new object[] {}).ToString();
            }

            i++;

            if(strValue == "true")
            {
                break;
            }                       
        }

        if (strValue != string.Empty)
        {
            ppPress = ppApp.Presentations[i];
        }
        else
        {
            ppPress = AddPresentation(ppApp, ppPress);
        }
    }

    i = ppPress.Slides.Count + 1;

    int j = 0;

    chartObjects.Reverse();
    chartObjects.ForEach(chartObject =>
    {
         string directory = Path.Combine(System.Windows.Forms.Application.StartupPath, (i) + ".png");
         PowerPoint.Slide actSlide = ppPress.Slides.Add(i, PpSlideLayout.ppLayoutBlank);
         actSlide = ppPress.Slides[i];
         Size size = chartObject.Chart.Size;

         chartObject.Chart.ChartAreas[0].AxisX.LabelsAutoFitMinFontSize = 14;

         chartObject.Chart.Size = new Size(RunTime.Configuration.ImageXSize,RunTime.Configuration.ImageYSize);

         chartObject.Chart.SaveAsImage(directory, ChartImageFormat.Png);
         chartObject.Chart.Size = size;
         Image image = Image.FromFile(directory);
         actSlide.Shapes.AddPicture(directory, MsoTriState.msoFalse,
                  MsoTriState.msoTrue, 0, 0, (int)ppPress.SlideMaster.Width, (int)ppPress.SlideMaster.Height);

         image.Dispose();
         File.Delete(directory);
         j++;
    });

    chartObjects.Reverse();

    ppApp.Visible = MsoTriState.msoTrue;

    foreach (ChartObject chartObject in chartObjects)
    {
        chartObject.Chart.BorderLineStyle = ChartDashStyle.Solid;
    }
}

РЕДАКТИРОВАТЬ.только когда открыто хотя бы одно окно PowerPoint и презентация в этом окне еще не сохранена на диск.Когда открыто хотя бы одно окно PowerPoint с презентацией, уже сохраненной на диск, приложение работает нормально.

1 Ответ

1 голос
/ 14 января 2011

Я испытал то, что, как я подозреваю, может быть похожей проблемой (в то время, когда в PowerPoint использовались встроенные шрифты для необъяснимых исключений в коде, который раньше работал, но мы его отследили). Оказалось, что оставалось неотвеченным, невидимым диалоговым окном, блокирующим приложение, и библиотека взаимодействия превратилась в исключение. По сути, наш опыт показал, что существует множество функций приложения PowerPoint, которые недоступны для классов взаимодействия, и если они достигаются в нормальном режиме работы, то код взаимодействия либо зависает, либо ломается (обычно ломается). Таким образом, в нашем случае не было флага взаимодействия, позволяющего использовать встроенные шрифты (в приложении PowerPoint, когда файл имеет встроенные шрифты, он вызывает приглашение (хотите ли вы открыть его в режиме только для чтения, или нет вообще) ?)) на который нужно ответить, и поскольку в библиотеках взаимодействия нет возможности указать ваш выбор, вызов взаимодействия выдает исключение. Итак, я предполагаю, что здесь что-то происходит, когда библиотека взаимодействия не может ответить на «блокирующий» вопрос, поставленный приложением PowerPoint.

Конечно, наиболее распространенные причины, по которым мы столкнулись с этой проблемой, были вызваны тем, что Центр обновления Windows предоставляет обновления для Office, которые обновляют параметры безопасности PowerPoint по умолчанию. Возможно, вы захотите сначала это проверить.

Если бы вы выполнили то же действие (измените это поле на «браузер», как мне кажется, вы это делаете) в обычном окне приложения PowerPoint, на презентации, которая не была сохранена, она представила бы вас с диалогом?

...