Создание пакетов NuGet, содержащих сборки COM-взаимодействия

Пакеты, содержащие сборки COM-взаимодействия, должны включать в себя соответствующий файл целей, чтобы в проекты были добавлены правильные метаданные EmbedInteropTypes в формате PackageReference. По умолчанию метаданные EmbedInteropTypes всегда имеют значение false для всех сборок при использовании PackageReference, поэтому файл целей добавляет эти метаданные явным образом. Во избежание конфликтов имя цели должно быть уникальным. В идеале следует использовать сочетание имен пакета и внедряемой сборки, заменив им элемент {InteropAssemblyName} в приведенном ниже примере. (Пример см. также на странице NuGet.Samples.Interop.)

<Target Name="Embedding**AssemblyName**From**PackageId**" AfterTargets="ResolveReferences" BeforeTargets="FindReferenceAssembliesForReferences">
  <ItemGroup>
    <ReferencePath Condition=" '%(FileName)' == '{InteropAssemblyName}' AND '%(ReferencePath.NuGetPackageId)' == '$(MSBuildThisFileName)' ">
      <EmbedInteropTypes>true</EmbedInteropTypes>
    </ReferencePath>
  </ItemGroup>
</Target>

Имейте в виду, что при использовании формата управления packages.config добавление ссылок на сборки из пакетов приводит к тому, что NuGet и Visual Studio проверяют наличие сборок COM-взаимодействия и присваивают свойству EmbedInteropTypes в файле проекта значение true. В этом случае целевые объекты переопределяются.

Кроме того, по умолчанию ресурсы сборки не передаются транзитивно. Пакеты, созданные описанным здесь способом, работают иначе, если они извлекаются в качестве транзитивной зависимости из проекта в ссылку на проект. Пользователь пакета может разрешить их передачу, изменив значение PrivateAssets по умолчанию так, чтобы сборка не включалась.