【问题标题】:Embed Interop Types to false in NuGet package在 NuGet 包中将互操作类型嵌入为 false
【发布时间】:2018-03-03 08:32:32
【问题描述】:

我需要在我的项目中引用一个程序集,它需要将“嵌入互操作类型”设置为 false 才能成功编译。如果我不放这个选项,我会得到编译时错误:

A reference was created to embedded interop assembly 'Interop.MSTSCLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because of an indirect reference to that assembly created by assembly 'AxInterop.MSTSCLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Consider changing the 'Embed Interop Types' property on either assembly.

如果我只是有一个项目,我会将选项设置为 false 并且从不担心它,但现在我正在使用它制作一个 nuget 包,我正在尝试找到一种设置选项的方法添加包时

我的 nuspec 文件目前有这个(省略元数据):

<files>
  <file src="Interop.MSTSCLib.dll" target="lib\net40" />
  <file src="AxInterop.MSTSCLib.dll" target="lib\net40" />
</files>

我查看了 nuget 文档,但找不到如何执行此操作。有没有可能?

【问题讨论】:

    标签: visual-studio nuget


    【解决方案1】:

    你需要一个 install.ps1 在工具目录中,比如

    param($installPath, $toolsPath, $package, $project)
    
    $project.Object.References | Where-Object { $_.Name -eq "Interop.MSTSCLib" } |  ForEach-Object { $_.EmbedInteropTypes = $false }
    $project.Object.References | Where-Object { $_.Name -eq "AxInterop.MSTSCLib" } |  ForEach-Object { $_.EmbedInteropTypes = $false }
    

    基于问题Can NuGet distribute a COM dll?,它是answer。区别在于您不需要调用 regsvr32,因为您不尝试分发和注册 com dll。

    【讨论】:

    • 太棒了,虽然install.ps1 似乎不再受支持。我改为使用init.ps1,并将其放在tools 中,效果很好!
    • 根据issue,对 install.ps1 的支持的未来似乎不确定。如果您的项目使用 PackageReference 节点,则仅支持 init.ps1。 PackageReference 节点的支持目前是limited 到一些项目类型(.Net Core、.Net Standard 和 Visual Studio 2017 中的 UWP)。
    • 现在推荐的方法是使用 Nuget 对 MSBuild 目标文件的支持。见:Nuget.Samples.Interop
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-01-29
    • 2012-02-27
    • 2023-03-04
    • 2017-10-12
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多