.NET core 3.0 и взаимодействие с MS Office
Я пытаюсь использовать недавно выпущенное ядро .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)
6 ответов
Решение несколько необычное, но возможное.
Создайте новый проект.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>
Не используйте пакеты NuGet, они несовместимы с.NET Core.
Обновить:
Теперь вы можете добавлять ссылки COM прямо из IDE (начиная с Visual Studio 2019 v16.6):
Я была такая же проблема. Я исправил это, открыв свойства ссылки и установив для "Копировать локально" и "Встраивать типы взаимодействия" значение "Да".
Обновление: это фактически то же самое, что и добавление этих двух строк в ссылку COM в файле.csproj.
<COMReference Include="Microsoft.Office.Core">
...
<EmbedInteropTypes>True</EmbedInteropTypes>
<Private>true</Private>
</COMReference>
Тег "Private" не упоминается в принятых ответах, но он предотвращает множество проблем.
Упоминание шагов по переносу любого взаимодействия или DLL, которые не поддерживаются, в ядро .net
- Создать основной проект .net
- Получить dll из старого проекта / через пакет nuget
- Если это interop dll, щелкните правой кнопкой мыши зависимости
- Нажмите на Добавить ссылку на com.
- Выберите dll, которую хотите добавить
- После добавления выберите эти зависимости и щелкните свойство
- Внутри окна свойств Задайте два свойства: а) Копировать локально - Да, б) Встраивать типы взаимодействия - Да
- Окно снимков экранасвойств
Удачного кодирования!Tahnks
Сборки взаимодействия несовместимы с.NET Core. Вы должны использовать полную структуру.
См. Также этот выпуск GitHub
Если вы хотите программно создавать документы Office, вы можете взглянуть на Office OpenXML SDK.
Мне пришлось преобразовать проект .NET Framework 4.7.2 в .NET Standard 2.0, и описанные решения у меня не работали. В моем случае процесс был таким:
Добавить ссылки на
Microsoft.Office.Interop.Word
а такжеOffice
. У меня не было возможности добавлять ссылки COM, я не знаю почему, но он работает с «обычными» ссылками.В файле .csproj добавьте строку
<EmbedInteropTypes>True</EmbedInteropTypes>
Мне пришлось сделать это вручную, так как в Visual Studio эта опция была недоступна.
Тогда .csproj выглядит так:
- Добавьте пакет nuget "Microsoft.CSharp"