NuGet包将非托管dll复制到根目录而不是bin

时间:2016-09-19 11:41:38

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

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

我们希望从我们的Team Services私有包Feed中提取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 Feed中引用新包。

  

构建解决方案时,libtidy.dll位于 root 目录中,而不是 bin 目录

  • 在构建后查看libtidy(在根目录中)的属性时,Copy to output directory设置为Copy always
  • 当我查看项目属性时,在build标签下,Output path设置为bin\

谁能看到我做错了什么?

注意:此问题是此Stack Overflow question的后续问题 - 来自接受答案的用户说一切都应该有效,但我仍然遇到此问题。

据我所见,我按照他的指示写信......

1 个答案:

答案 0 :(得分:2)

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

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

以下是我的包装结构,请将其与您的包装进行比较。 enter image description here