我有一个可以将幻灯片导出到 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/