.NET core 3.0 和 MS Office Interop

Pet*_*ull 23 .net .net-core

我正在尝试使用互操作程序集将最近发布的 .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>
Run Code Online (Sandbox Code Playgroud)

和这个 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这失败了

<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>
Run Code Online (Sandbox Code Playgroud)

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dri*_*nen 31

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

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

<COMReference Include="Microsoft.Office.Core">
    ...
    <EmbedInteropTypes>True</EmbedInteropTypes>
    <Private>true</Private>
</COMReference>
Run Code Online (Sandbox Code Playgroud)

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

  • @nam Rt-单击项目名称,选择“添加”,然后选择“引用”。从“添加引用”对话框的 COM 选项卡添加 Microsoft Excel 16.0 对象库。对 Interop.Microsoft.Office.Interop.Excel 的引用出现在 COM 下的项目依赖项中。您可以按住 rt 单击并选择属性来访问复制本地和嵌入互操作类型。 (4认同)
  • @nam 是的,这就是我正在做的事情。我根据列出的步骤添加了参考,然后按照 Dries Greenen 的答案中列出的步骤进行操作,现在我成功创建了一个新选项卡并将数据添加到使用 .NET Core 3.1 的现有 Excel 工作簿 .xlsb (2认同)

sil*_*ire 23

对此的解决方案有点古怪,但可能。

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

它应该类似于:

<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>
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

在此处输入图片说明


小智 14

只需删除对 Interop 包的 Nuget 引用并从引用管理器中添加 Microsoft Excel 即可。 在此输入图像描述

  • 我最近将 .NET 4.8 解决方案更新为 .NET 6,并利用 NUGET 互操作包让 Excel 和 Word 互操作功能正常工作,但过去几个月发生了一些变化 - 认为我们的系统管理员可能已经更新了已安装的 Office 版本 - 并且我开始收到:无法加载文件或程序集“office,Version=15.0.0.0,Culture=neutral,PublicKeyToken=71e9bc111e9429c”或其依赖项之一。系统找不到指定的文件按照删除 NUGET 并使用 COM 引用修复的建议。 (3认同)

Har*_*hah 6

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

  1. 创建.net核心项目
  2. 从旧项目/通过 nuget 包获取 dll
  3. 如果是 interop dll,则右键单击依赖项
  4. 单击添加 com 参考
  5. 选择要添加的dll
  6. 添加后选择依赖项并单击属性
  7. 在属性窗口内设置两个属性 a) 复制本地 - 是,b) 嵌入互操作类型 - 是
  1. 编写你的代码
  2. 执行它
  3. 它会对你有用!

Nuget 包将无法工作,请查看屏幕截图。 包不兼容

快乐编码!谢谢