Créer des packages NuGet contenant des assemblys COM Interop

Les packages qui contiennent des assemblys COM Interop doivent inclure un fichier de cibles approprié afin que les bonnes métadonnées EmbedInteropTypes soient ajoutées aux projets en utilisant le format PackageReference. Par défaut, les métadonnées EmbedInteropTypes sont toujours fausses pour tous les assemblys lorsque PackageReference est utilisé, si bien que le fichier de cibles ajoute ces métadonnées explicitement. Pour éviter les conflits, le nom de la cible doit être unique ; dans l’idéal, utilisez une combinaison du nom de votre package et de l’assembly incorporé, en remplaçant {InteropAssemblyName} dans l’exemple ci-dessous par cette valeur. (Consultez également NuGet.Samples.Interop pour obtenir un exemple.)

<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>

Notez que, si le format de gestion packages.config est utilisé, l’ajout de références aux assemblys à partir des packages amène NuGet et Visual Studio à rechercher des assemblys COM Interop et à affecter à EmbedInteropTypes la valeur true dans le fichier projet. Dans ce cas, les cibles sont remplacées.

De plus, les ressources de build ne circulent pas de manière transitive par défaut. Les packages créés comme décrit ici fonctionnent différemment quand ils sont extraits en tant que dépendance transitive d’un projet vers une référence de projet. Le consommateur du package peut les autoriser à circuler en modifiant la valeur par défaut PrivateAssets de sorte à ce qu’elle n’inclue pas de build.