创建包含 COM 互操作程序集的 NuGet 包

包含 COM 互作程序集的包必须包含适当的 目标文件 ,以便使用 PackageReference 格式将正确的 EmbedInteropTypes 元数据添加到项目中。 默认情况下, EmbedInteropTypes 使用 PackageReference 时所有程序集的元数据始终为 false,因此目标文件会显式添加此元数据。 为了避免冲突,目标名称应是唯一的;理想情况下,使用你的包名称与嵌入的程序集的组合,将以下示例中的 {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 默认值修改为不包括构建来允许它们流通。