.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 Local
和Embed 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 项目中生成的引用添加到 <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>
不要使用 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) 嵌入互操作类型 - 是
-
编写您的代码
执行它
它会为你工作!
Nuget 包将无法工作,请查看截图。
编码愉快! 谢谢
【讨论】:
以上是关于.NET 核心 3.0 和 MS Office 互操作的主要内容,如果未能解决你的问题,请参考以下文章
.Net 使用 Office 互操作打印 PowerPoint 文档
在 ASP.net MVC6 网站上使用 Office 互操作