COM 相互運用アセンブリを含む NuGet パッケージを作成する

COM 相互運用アセンブリを含むパッケージには、PackageReference 形式を利用して正しい EmbedInteropTypes メタデータがプロジェクトに追加されるように、適切な targets ファイルが含まれる必要があります。 既定では、PackageReference が使用されるとき、EmbedInteropTypes メタデータは常にすべてのアセンブリに対して false になります。それにより、targets ファイルでこのメタデータが明示的に追加されます。 競合を回避するために、ターゲット名を一意にする必要があります。理想的には、パッケージ名と組み込むアセンブリの組み合わせを使用します。下の例の {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 の既定値を変更することでそれをフローさせることができます。