PowerPoint.Application.Presentations 缺少 MsoTriState

PowerPoint.Application.Presentations missing MsoTriState

我正在尝试使用 C# 中的 PowerPoint 自动执行流程,为此我想打开(或创建新的)PowerPoint 演示文稿,添加幻灯片,然后保存文档。

我已经在我的机器上安装了整个 office 2019 软件包,并且可以通过引用 Interop.Microsoft.Office.Interop.PowerPoint(来自 Microsoft PowerPoint 16.0 对象库参考)和 [= 来访问 ppt api 13=](来自 Microsoft Office 16.0 对象库参考)。

我尝试使用以下代码打开 powerpoint:

using Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;

class PowerPointManager
{
    public PowerPointManager()
    {
        string powerPointFileName = @"C:\temp\test.pptx";

        Application pptApplication = new Application();
        Presentation ppt = pptApplication.Presentations.Open(powerPointFileName, MsoTriState.msoTrue); //MsoTriState comes from Microsoft.Office.Core

    }
}

但是这会导致 pptApplication.Presentations.Open)

行出错

Error CS0012 The type 'MsoTriState' is defined in an assembly that is not referenced. You must add a reference to assembly 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

尽管 MsoTriState 最明确地定义在 Microsoft.Office.Core 中,它是 office.dll 程序集的一部分 (msdn reference)

当我尝试使用 VS2019 的快速操作时,我会看到“添加对“office 版本 15.0.0.0”的引用”选项。执行此快速操作会打开引用管理器,但不会添加任何引用。手动搜索“Office”也不会产生任何简单命名为“office”的结果。最接近的是“Microsoft Office 16.0 对象库”,已被引用。

据我所知,这与函数参数要求的 MsoTriStrate 相同,那么为什么它不接受这个?尝试用 MsoTriState 值代替它的整数值(例如 -1 代表真)也不起作用。

使用 .NET Core 3.1 WinForms,Office 2019(包括 powerpoint)32 位,在 W10 x64 企业版和 Visual Studio 2019 上安装了 Office/Sharepoint 开发工具集。

看起来 tlbimp 在某个时候不正确地生成了互操作程序集。您可以在 \obj\Debug\netcoreapp3.1\Interop.Microsoft.Office.Interop.PowerPoint.dll.

找到该程序集

要正确重新生成它,您需要执行以下操作:

  1. 删除对“Microsoft PowerPoint 16.0 对象库”的引用。清理并重建项目。此时您也可以尝试卸载项目并手动删除 binobj 文件夹。
  2. 添加对“Microsoft 15.0 对象库”和“Microsoft 16.0 对象库”的引用。
  3. 添加对“Microsoft PowerPoint 16.0 对象库”的反向引用,并再次清理并重建项目。

执行这些步骤后,我的 .NET Core 3.1 WinForms 项目编译成功。

在我的案例中,.csproj 文件的内容如下:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup>
    <COMReference Include="Microsoft.Office.Core">
      <WrapperTool>tlbimp</WrapperTool>
      <VersionMinor>8</VersionMinor>
      <VersionMajor>2</VersionMajor>
      <Guid>2df8d04c-5bfa-101b-bde5-00aa0044de52</Guid>
      <Lcid>0</Lcid>
      <Isolated>false</Isolated>
      <EmbedInteropTypes>true</EmbedInteropTypes>
    </COMReference>
    <COMReference Include="Microsoft.Office.Interop.PowerPoint">
      <WrapperTool>tlbimp</WrapperTool>
      <VersionMinor>12</VersionMinor>
      <VersionMajor>2</VersionMajor>
      <Guid>91493440-5a91-11cf-8700-00aa0060263b</Guid>
      <Lcid>0</Lcid>
      <Isolated>false</Isolated>
      <EmbedInteropTypes>true</EmbedInteropTypes>
    </COMReference>
  </ItemGroup>

</Project>