c# - Microsoft.Office.Interop.PowerPoint.dll PowerPoint CustomDocumentProperties 大问题

标签 c# interop powerpoint

我有一个可以将幻灯片导出到 PowerPoint 的应用程序。我正在使用 Microsoft.Office.Interop.PowerPoint.dll 。这是汇编的第 11 个版本。我今天运行了应用程序,应用程序似乎抛出了异常(HRESULT 异常:0x80070057 (E_INVALIDARG))。它只会在我单击导出按钮之前在系统中打开 powerpoint 应用程序时抛出此异常。我正在向 Powerpoint 演示文稿的 CustomDocumentProperties 添加自定义属性,以便识别应用程序创建的演示文稿。这是我第一次看到这个异常。我有 Windows 7 Ultimate x64 系统和 visual studio 2008 和 2010,当然还有 office 2007。

导致异常的代码部分:

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

怎么了? 我关注了微软的这篇文章: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 窗口时,应用程序运行正常。

最佳答案

当 PowerPoint 使用嵌入字体时,我遇到了我怀疑可能是类似问题的问题(当时,以前工作的代码出现莫名其妙的异常,但我们确实追踪到了它)。结果是一个未回答的、不可见的对话框阻塞了应用程序,互操作库将其变成了一个异常。本质上,我们的经验是,PowerPoint 应用程序的许多功能对互操作类不可用,如果在正常操作中达到这些功能,则互操作代码要么挂起要么中断(通常是中断)。因此,在我们的例子中,没有允许使用嵌入字体的互操作标志(在 PowerPoint 应用程序中,当文件包含嵌入字体时,它会强制提示(你想以只读模式打开它,还是根本不打开?)) 必须回答,并且由于互操作库中无法指定您的选择,因此互操作调用会引发异常。因此,我的猜测是互操作库无法回答 PowerPoint 应用程序提出的“阻塞”问题。

当然,我们遇到此问题的最常见原因都是 Windows Update 为 Office 提供更新,从而更新 PowerPoint 的安全默认值。您可能想先检查一下。

如果您要在普通的 PowerPoint 应用程序窗口中,在尚未保存的演示文稿上执行相同的操作(将该字段更改为“浏览器”,我认为您似乎正在做),它会向您展示有对话框?

关于c# - Microsoft.Office.Interop.PowerPoint.dll PowerPoint CustomDocumentProperties 大问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302783/

相关文章:

c# - 如何获取 Windows 服务登录用户的安全 token ?

c# - 如何将包含包含数组的列表的列表从 C# 序列化为 JSON?

c# - 将 C char[][] 数组编码到 C#

java - Google Drives SDK 和 powerpoint

xml - 从 powerpoint 幻灯片中检索 Excel 图表数据(以编程方式)

c# - ScrollViewer 不适用于 StackPanel

c# - XDocument 元素返回 null

c# - 如何在数据标签 C# 中使用模式属性

c++ - Visual C++、std 和 getline(ifstream, string)、EOF 在 std 堆栈内抛出和中断,这正常吗?

ios - Apple TV第4代中的Powerpoint