【问题标题】:NuGet package copies unmanaged dll to root directory instead of binNuGet 包将非托管 dll 复制到根目录而不是 bin
【发布时间】:2017-01-27 02:15:27
【问题描述】:

我有一个使用非托管库libtidy.dll 的应用程序。在我们的代码中使用了一个包装器TidyManaged 来使用它。

我们想从我们的团队服务私有包提要中提取libtidy,以便将其放置在bin 目录中

为此,我正在创建一个 NuGet 包,如下所示:

  • 创建目录libtidy-managed
  • libtidy.dllTidyManaged.dll都放到新目录中
  • 从此目录运行nuget spec,包含以下文件

Package.nuspec:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>libtidy-tidymanaged</id>
    <version>1.0.0</version>
    <authors>Name</authors>
    <owners>Name</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Libtidy TidyManaged</description>
    <releaseNotes>Libtidy TidyManaged</releaseNotes>
    <copyright>Copyright 2016</copyright>
    <tags>Libtidy TidyManaged</tags>
  </metadata>
  <files>
      <file src="libtidy.dll" target="content" />
      <file src="TidyManaged.dll" target="lib" />
      <file src="Install.ps1" target="tools" />
  </files> 
</package>

Install.ps1

param($installPath, $toolsPath, $package, $project)

$file = $project.ProjectItems.Item("libtidy.dll");

If ($file -eq $null)
{
    $project.ProjectItems.AddFromFile("libtidy.dll");
    $file = $project.ProjectItems.Item("libtidy.dll");
}

$file.Properties.Item("CopyToOutputDirectory").Value = [int]1;

然后我使用 nuget pack 创建包并在本地 nuget 提要中引用新包。

当我构建解决方案时,libtidy.dll 放在 root 目录中,而不是 bin 目录

  • 编译后查看libtidy(在根目录下)的属性时,Copy to output directory设置为Copy always
  • 当我查看项目属性时,在build 选项卡下,Output path 设置为bin\

谁能看出我做错了什么?

注意:这个问题是这个Stack Overflow question 的后续问题 - 接受答案的用户说一切都应该工作,但我仍然遇到这个问题。

据我所知,我是按照他的指示,信中...

【问题讨论】:

    标签: c# asp.net-mvc visual-studio nuget nuget-package


    【解决方案1】:

    按照您的步骤,我在构建解决方案后成功将 libtidy.dll 复制到了 bin 目录。构建解决方案时不会复制根目录中的 libtidy.dll。安装软件包时应该添加它。因为 libtidy.dll 是一个非托管的 dll,无法在项目参考中直接引用。我们经常通过将它们添加到项目目录中来引用这种类型的dll。

    构建解决方案后,请检查 bin 目录,应该还有一个 libtidy.dll,在构建解决方案时复制它。如果没有这个dll,请检查您的step2,确保您将libtidy.dll、TidyManaged.dll和Install.ps1文件直接放在同一个。并且项目的输出路径应该是“bin\Debug”。

    以下是我的包结构,请与您的包进行比较。

    【讨论】:

    • 感谢您的回复。我注意到 libtidy 现在在脚本执行后按预期位于 bin 目录中。您能否建议如何使用 powershell 脚本从根目录中删除 libtidy? (我从来没有真正使用过powershell)
    • 恐怕我们无法从根目录中删除 libtidy。因为它是一个非托管的dll,所以我们需要通过将它添加到根目录来引用它。当您重建项目时,bin 文件夹将被清理。如果 libtidy 从根目录中删除,当你重建项目时,libtidy 不会复制到 bin 文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2020-06-22
    相关资源
    最近更新 更多