.NET 核心 3.0 和 MS Office 互操作

Posted

技术标签:

【中文标题】.NET 核心 3.0 和 MS Office 互操作【英文标题】:.NET core 3.0 and MS Office Interop 【发布时间】:2020-01-27 12:54:42 【问题描述】:

我正在尝试通过互操作程序集将最近发布的 .NET 核心与 MS Office 一起使用

我有一个最小的项目文件

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Office.Interop.Word">
      <Version>15.0.4797.1003</Version>
    </PackageReference>
  </ItemGroup>

</Project>

还有这个 C# 程序

using System;
using Microsoft.Office.Interop.Word;
namespace ii

    class Program
    
        static void Main(string[] args)
        
            var app = new Application();
            Console.WriteLine(app.Version);
            app.Quit();
        
    

不幸的是,这失败了

Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'. The system cannot find the file specified.
File name: 'office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

当我将包添加到项目中时,我得到了这个

warn : Package 'Microsoft.Office.Interop.Word 15.0.4797.1003' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' instead of the project target framework '.NETCoreApp,Version=v3.0'. This package may not be fully compatible with your project.
info : Package 'Microsoft.Office.Interop.Word' is compatible with all the specified frameworks in project 

暗示“兼容”但不“完全兼容”

有没有办法做到这一点,或者我必须使用 .NET Framework 而不是 Core?

我使用的是 Windows 10、.NET core 3.0.100 和 MS Office 365(Word 版本为 16.0.11929.20298)

【问题讨论】:

core 2.0 and office interop - where is the microsoft.office.core package?的可能重复 每次尝试使用 .NET Core 中的 .NET Old 程序集时都会收到该警告。这并不意味着互操作程序集不起作用。您是否尝试过使用您的应用程序? 在任何情况下,您都不需要 互操作程序集来使用 COM。您可以使用 dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application", true)); 的后期绑定打开 Excel 并开始使用您返回的 Application 对象 - 无需类型支持。互操作程序集通过提供 CLSID 和强类型代理对象让生活变得更轻松,否则您必须自己创建。 我已经尝试使用我的应用程序,我得到了上面提到的FileNotFoundException @PeterHull 测试 Silkfire 的答案 first - 使用自动生成的代理对象创建 COM 引用。它们不会像互操作程序集那样好(例如,某些参数可能是整数而不是枚举)但它们肯定比dynamic 【参考方案1】:

我遇到了同样的问题。我通过打开引用属性并将“复制本地”和“嵌入互操作类型”设置为“是”来修复它。

更新:这实际上与将这两行添加到 .csproj 文件中的 COM 引用做同样的事情。

<COMReference Include="Microsoft.Office.Core">
    ...
    <EmbedInteropTypes>True</EmbedInteropTypes>
    <Private>true</Private>
</COMReference>

接受的答案中没有提到“私人”标签,但它可以防止很多问题。

【讨论】:

虽然这足以让我不敢切换到 Core。它应该可以工作。 @DriesGeenen a) 您是如何添加对office interop 的引用和b) 您将哪些文件的属性设置为Copy LocalEmbed Interop Types to 'Yes' @nam 右击项目名称,选择添加,然后选择引用。从“添加引用”对话框的“COM”选项卡中添加 Microsoft Excel 16.0 对象库。对 Interop.Microsoft.Office.Interop.Excel 的引用出现在 COM 下的项目 Dependencies 中。您可以 rt-click 并选择 Properties 以访问 Copy Local 和 Embed Interop Types。 @RickV 你是最棒的。你的建议就像一个魅力。我假设您正在谈论在 .NET Core 3.0 项目本身中执行所有这些操作,而不必担心用户 @silkfire 建议(也取自 official Microsoft sample)使用 .NET Core 3.0 进行 Excel 互操作的解决方法,对吗?跨度> @nam 是的,这就是我正在做的事情。我根据我列出的步骤添加了参考,然后我按照 Dries Greenen 在这个答案中列出的步骤,现在我成功地创建了一个新选项卡并将数据添加到具有 .NET Core 3.1 的现有 Excel 工作簿 .xlsb 【参考方案2】:

这个问题的解决方案有点古怪,但可能。

创建一个新的 .NET Framework 4.X 项目。将相关的 COM 引用添加到项目中。编辑 .NET Core 3.0 项目的 .csproj 并将 .NET Framework 项目中生成的引用添加到 &lt;ItemGroup&gt; 标记。

它应该类似于:

<ItemGroup>
    <COMReference Include="Microsoft.Office.Core">
      <Guid>2DF8D04C-5BFA-101B-BDE5-00AA0044DE52</Guid>
      <VersionMajor>2</VersionMajor>
      <VersionMinor>8</VersionMinor>
      <Lcid>0</Lcid>
      <WrapperTool>primary</WrapperTool>
      <Isolated>False</Isolated>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </COMReference>

... more references

</ItemGroup>

不要使用 NuGet 包,它们与 .NET Core 不兼容。

更新:

您现在可以直接从 IDE 添加 COM 引用(自 Visual Studio 2019 v16.6 起):

【讨论】:

我会试试这个,然后报告。您对@GSerg 引用的可能重复问题的答案中提到的 NetOffice 软件包有任何了解吗? 我不知道这些包,但正如回复者提到的,这只是他用作解决方法的东西。【参考方案3】:

只需删除对互操作包的 Nuget 引用并从引用管理器中添加 Microsoft Excel。

【讨论】:

【参考方案4】:

互操作程序集与 .NET Core 不兼容。您必须使用完整的框架。

另见GitHub Issue

如果您想以编程方式创建 Office 文档,您可能需要查看Office OpenXML SDK。

【讨论】:

我不确定 .NET Core 和 Office 的其他版本,但截至 2020 年 4 月 6 日,使用 .NET Core 3.1 和 O365,这无需技巧即可完成(除了 Dries上面提到的Geenen)。【参考方案5】:

提及将任何不支持的互操作或 dll 迁移到 .net 核心的步骤

    创建 .net 核心项目 从旧项目/通过 nuget 包获取 dll 如果是互操作 dll 则右键单击依赖项 点击添加com参考 选择要添加的dll 添加后选择该依赖项并单击属性 内部属性窗口 设置两个属性 a) 复制本地 - 是,b) 嵌入互操作类型 - 是
屏幕截图 Properties window
    编写您的代码 执行它 它会为你工作!

Nuget 包将无法工作,请查看截图。

编码愉快! 谢谢

【讨论】:

以上是关于.NET 核心 3.0 和 MS Office 互操作的主要内容,如果未能解决你的问题,请参考以下文章

.Net 使用 Office 互操作打印 PowerPoint 文档

在 ASP.net MVC6 网站上使用 Office 互操作

Office 互操作程序集 Windows 10

无法将 Microsoft Office 互操作程序集添加到项目

如何在互操作期间阻止 MS Graph 组件弹出?

Excel 互操作在装有 Office 2007 的机器上工作,但在装有 Office 2010 的机器上失败