Однако в .NET 4.0 и последующих версиях данные взаимодействия теперь можно встраивать прямо в скомпилированное приложение. В таком случае поставлять копию сборки взаимодействия вместе с приложением .NET Core больше не понадобится, т.к. все необходимые метаданные взаимодействия жестко закодированы в приложении .NET. В .NET Core встраивание сборки PIA является обязательным.
Чтобы встроить сборку PIA в среде Visual Studio, разверните узел Dependencies
внутри узла проекта, разверните узел СОМ, щелкните правой кнопкой мыши на элементеInterop.Microsoft.Office.Interop.Excel и выберите в контекстном меню пункт Properties (Свойства). В диалоговом окне Properties (Свойства) выберите в раскрывающемся списке Embed Interop Types (Встраивать типы взаимодействия) пункт Yes (Да), как показано на рис. 18.2.Для изменения свойства посредством файла проекта добавьте узел
Компилятор C# будет включать только те части библиотеки взаимодействия, которые вы используете. Таким образом, даже если реальная библиотека взаимодействия содержит описания .NET Core сотен объектов СОМ, в приложение попадет только подмножество определений, которые действительно применяются в написанном коде С#. Помимо сокращения размера приложения, поставляемого клиенту, упрощается и процесс установки, т.к. не придется устанавливать сборки PIA, которые отсутствуют на целевой машине.
Общие сложности взаимодействия с СОМ
Многие библиотеки СОМ определяют методы, принимающие необязательные аргументы, которые вплоть до выхода .NET 3.5 в языке C# не поддерживались. Это требовало указания значения Type.Missing
Type.Missing вставляется на этапе компиляции, если не указано какое-то специфическое значение.В качестве связанного замечания: многие методы СОМ поддерживают именованные аргументы, которые, как объяснялось в главе 4, позволяют передавать значения членам в любом порядке. Учитывая наличие поддержки той же самой возможности в языке С#, допускается просто "пропускать" необязательные аргументы, которые неважны, и устанавливать только те из них, которые нужны в текущий момент.
Еще одна распространенная сложность взаимодействия с СОМ была связана с тем фактом, что многие методы СОМ проектировались так, чтобы принимать и возвращать специфический тип данных по имени Variant
dynamic языка С#, типу данных Variant может быть присвоен на лету любой тип данных СОМ (строка, ссылка на интерфейс, числовое значение и т.д.). До появления ключевого слова dynamic передача и прием элементов данных типа Variant требовали немалых ухищрений, обычно связанных с многочисленными операциями приведения.Когда свойство EmbedlnteropTypes
true, все COM-типы Variant автоматически отображаются на динамические данные. В итоге не только сокращается потребность в паразитных операциях приведения при работе с типами данных Variant, но также еще больше скрываются некоторые сложности, присущие СОМ, вроде работы с индексаторами СОМ.Дополнительной сложностью при работе с взаимодействием с СОМ и .NET 5 является отсутствие поддержки на этапе компиляции и во время выполнения. Версия MSBuild в .NET 5 не способна распознавать библиотеки взаимодействия, поэтому проекты .NET Core, в которых задействовано взаимодействие с СОМ, не могут компилироваться с применением интерфейса командной строки .NET Core. Они должны компилироваться с использованием Visual Studio, и скомпилированный исполняющий файл можно будет запускать вполне ожидаемым способом.
Взаимодействие с СОМ с использованием динамических данных C#
Чтобы продемонстрировать, каким образом необязательные аргументы, именованные аргументы и ключевое слово dynamic
Car.cs, содержащий такой код:namespace ExportDataToOfficeApp
{
public class Car
{
public string Make { get; set; }
public string Color { get; set; }
public string PetName { get; set; }
}
}
Поместите в начало файла Program.cs
using:using System;
using System.Collections.Generic;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
using ExportDataToOfficeApp;