【问题标题】:Targets file for deploying nativs dlls to output directory用于将 nativs dll 部署到输出目录的目标文件
【发布时间】:2020-06-22 16:48:12
【问题描述】:

我有一个具有以下结构的 nuget:

Lib
  -> net45
    -> MyDll.dll
Runtimes
  -> win10-x64
    -> native
      dependency1.dll
      dependency2.dll
      dependency3.dll

我将此 nuget 添加到我的一个项目中。每当我构建该项目时,我都希望将所有 dll 复制到输出目录中。但是,只有“MyDll.dll”会被复制,而本机运行时文件夹中的所有 dll 都不会。我已经看到这篇文章解释了如何使用 .targets 文件来完成此操作:Add native files from NuGet package to project output directory。但是,我找不到有关如何添加 .targets 文件的具体信息,而且这篇文章已有 6 年历史。现在肯定存在一些新的/更好的东西吗?

基本上,将本机 dll 复制到构建的输出目录中的最佳方法是什么?

【问题讨论】:

  • 我假设您正在尝试生成 .zip 或其他输出,以便您可以部署项目,如果是这样,您需要运行“发布”而不是仅运行“构建” . “发布”目标将确保您的应用程序运行所需的所有文件都位于输出文件夹中。根据您构建此项目的方式(通过 CLI、Visual Studio、dotnet.exe 进行 MSBuild),有几种方法可以完成此任务。尝试从 NuGet 包中提取文件会带来很多麻烦,希望您不必去那里。

标签: c# dll build msbuild nuget


【解决方案1】:

这真的取决于您的客户端项目是本地项目还是托管项目。

如果你的项目是原生项目,你需要做的是:

  1. 假设我们有以下结构:
    • Win32
      • yourlibrary.lib
      • yourlibrary.dll
    • x64
      • yourlibrary.lib
      • yourlibrary.dll
  • 包括
    • yourlib.h
  • YourPackage.nuspec
  • YourPackage.targets
  1. YourPackage.nuspec 文件包含如下内容:
<?xml version="1.0"?>
<package >
  <metadata>
    <id>YourPackage</id>
    <version>1.0.0.0</version>
    <title>Your Packaged Software</title>
    <authors>your name</authors>
    <owners>your name</owners>
    <iconUrl>link to icon</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Description for your package</description>
    <releaseNotes>Fixed that, added this</releaseNotes>
    <copyright>Copyright by you</copyright>
    <tags>native yourpackage library</tags>
  </metadata>
  <files>
    <!-- .targets file that should be included in the dependee project automatically by Nuget -->
    <file src="YourPackage.targets" target="\build\native\YourPackage.targets" />

    <!-- Include header files for development -->
    <file src="include\**" target="\lib\native\include" />
  
    <!-- Binaries -->
    <file src="bin\**" target="\lib\native\bin" />
  </files>
</package>
  1. 然后添加 .target 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
  <ItemDefinitionGroup>
    <!-- COMPILATION -->
    <!-- header files (.h) that should be copied  -->
    <ClCompile>
      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)..\..\lib\native\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <!-- This is just for the convinience, so you can check within C++ code if the package is used, i.e.: #ifdef HAS_YOUR_PACKAGE -->
      <PreprocessorDefinitions>HAS_YOUR_PACKAGE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>

  <!-- LINKING -->
  <!-- Add static/import library for linking -->
  <ItemDefinitionGroup>
    <Link>
      <AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)..\..\lib\native\bin\$(Platform)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
      <AdditionalDependencies>yourlibrary.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  
  <!-- DEPLOYMENT -->
  <!-- Copy dlls to $(OutDir) -->
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)..\..\lib\native\bin\$(Platform)\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>     
</Project>

  1. 完成所有这些后,在包目录中运行: nuget pack YourPackage.nuspec 这将创建一个新的 nuget 包,在本机项目中使用该包应该可以工作。

更新 重要提示:在 .targets 文件的最后一部分中,您必须命名保存要复制到输出文件夹的文件名的变量。不要给这个变量提供通用名称“NativeLibs”,因为如果您将拥有超过 1 个本机 nuget 包,则在 VS 中加载使用该包的项目时会发生冲突。

为避免名称冲突,请为其指定一个唯一名称。像 YourPackageNativeLibs 这样的东西会起作用。所以最后一部分看起来像:

  <!-- DEPLOYMENT -->
  <!-- Copy dlls to $(OutDir) -->
  <ItemGroup>
    <YourPackageNativeLibs Include="$(MSBuildThisFileDirectory)..\..\lib\native\bin\$(Platform)\*.dll" />
    <None Include="@(YourPackageNativeLibs)">
      <Link>%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>     
</Project>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2010-12-19
    • 2021-08-25
    相关资源
    最近更新 更多