将Nuget包中的非托管DLL包含到Web Deploy包中

时间:2017-11-20 20:27:27

标签: .net visual-studio msbuild nuget

我有Nuget包,其中包含非托管DLL和目标,以将此DLL复制到输出文件夹:

<?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Target Name="AfterBuild" DependsOnTargets="CopyFilesToOutputDirectory">
          <ItemGroup>
              <MyPackageSourceFile Include="$(SolutionDir)\packages\somepackage\unmanaged\*.dll" />
          </ItemGroup>
          <Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(OutputPath)" />
      </Target>
</Project>

当我构建项目(使用Visual Studio)

时,这非常有效

但是,如果我想创建发布包(To File System,或者再次使用VS进行Web部署),则不包括这些dll。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

将Nuget包中的非托管DLL包含到Web部署包

您可以在NuGet包中的目标AfterBuild之后添加另一个目标,以将这些非托管DLL文件动态地包含到项目文件中,或者将目标简单地添加到项目文件中。

要完成此操作,请在NuGet包中添加目标订单为AfterTargets="AfterBuild"的目标:

  <Target Name="AddUnmanagedDll" AfterTargets="AfterBuild">  
    <ItemGroup>
      <Content Include="$(OutputPath)\*.dll" />
    </ItemGroup>
  </Target>

但是这个目标会添加所有的dll文件,包括托管的dll文件。要解决此问题,我们需要更改以前的目标AfterBuild以添加另一个复制任务,以将这些非托管dll文件复制到单独的文件夹

  <Target Name="AfterBuild" DependsOnTargets="CopyFilesToOutputDirectory">
    <ItemGroup>
      <MyPackageSourceFile Include="$(SolutionDir)packages\somepackage\unmanaged\*.dll" />
    </ItemGroup>
    <Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(OutputPath)" />
    <Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(ProjectDir)UnmanagedDll" />
  </Target>

添加另一个复制任务<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(ProjectDir)UnmanagedDll" />后,将非托管dll文件复制到单独的文件夹$(ProjectDir)UnmanagedDll

然后我们可以将目标<Content Include="$(OutputPath)\*.dll" />中的ItemGroup AddUnmanagedDll更改为<Content Include="UnmanagedDll\*.dll" />

因此NuGet包中的目标应为:

  <Target Name="AfterBuild" DependsOnTargets="CopyFilesToOutputDirectory">
    <ItemGroup>
      <MyPackageSourceFile Include="$(SolutionDir)packages\app.1.0.0\unmanaged\*.dll" />
    </ItemGroup>
    <Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(OutputPath)" />
    <Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(ProjectDir)UnmanagedDll" />
  </Target>

  <Target Name="AddUnmanagedDll" AfterTargets="AfterBuild">  
    <ItemGroup>
      <Content Include="UnmanagedDll\*.dll" />
    </ItemGroup>
  </Target>

发布项目后,那些未受管理的项目将包含在Web Deploy包中:

enter image description here