如何设置MyPackage.targets文件以将所有dll添加到bin / debug或bin / Release文件夹中?

时间:2019-06-03 14:08:42

标签: c# msbuild nuget

我正在学习NuGet。我确信这不是一个不常见的任务。我有一些本机dll,需要添加到最终输出中。共有25个dll,但其中只有7个可以直接添加为引用。

我目前有一个NuGet软件包,它使用以下结构直接添加7​​个引用:

build
    x64
        reference1.dll
        ...
        reference7.dll
        TheOthers1.dll
        ...
        TheOthers20.dll
    MyPackage.targets
lib
    net472
        reference1.dll
        reference2.dll
        reference3.dll
        reference4.dll
        reference5.dll
        reference6.dll
        reference7.dll

我的目标文件如下:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

我的项目输出最终看起来像这样:

bin/Debug
    Reference1.dll
    ...
    Reference7.dll
    x64
        reference1.dll
        ...
        reference7.dll
        TheOthers1.dll
        ...
        TheOthers20.dll

当我运行该应用程序时,我得到:

  

System.IO.FileNotFoundException:'无法加载文件或程序集'reference1.dll'或其依赖项之一。找不到指定的模块。'

如果我将x64文件夹中的dll复制到bin / Debug文件夹中,则该应用程序将运行。

如何构造.targets文件以将build / x64中的所有dll复制到bin / Debug或bin / release中?

2 个答案:

答案 0 :(得分:2)

对于本机DLL,始终始终设置<OutDir>属性。这确定了编译后的二进制文件的位置。看起来像这样:

<OutDir>bla bla bla\bin\$(Configuration)\</OutDir>

注意它也必须以反斜杠结尾。

对于托管DLL,始终始终设置<OutputPath>属性。这确定了编译后的托管程序集的位置。看起来像这样:

<OutputPath>bla bla bla\bin\$(Configuration)\</OutputPath>

注意他们俩都去同一个地方吗?

答案 1 :(得分:1)

我有类似的问题。我通过使用“复制”功能解决了这一问题。参见下面的示例:

<Target Name="CopyREsources" AfterTargets="Build">
    <Copy
       SourceFiles="$(MSBuildThisFileDirectory)PDFtoPrinter.exe"
       DestinationFiles="$(MSBuildProjectDirectory)\bin\$(Configuration)\PDFtoPrinter.exe"
       Condition="!Exists('$(MSBuildProjectDirectory)\bin\$(Configuration)\PDFtoPrinter.exe')" />
</Target>

完整代码here可用。