簡體   English   中英

用於將 nativs dll 部署到輸出目錄的目標文件

[英]Targets file for deploying nativs dlls to output directory

我有一個具有以下結構的 nuget:

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

我將此 nuget 添加到我的一個項目中。 每當我構建該項目時,我都希望將所有 dll 復制到輸出目錄中。 但是,只有“MyDll.dll”會被復制,而本機 Runtimes 文件夾中的所有 dll 不會被復制。 我看過這篇文章,它解釋了如何使用 .targets 文件來完成此操作: Add native files from NuGet package to project output directory 但是,我找不到有關如何添加 .targets 文件的具體信息,這篇文章已有 6 年歷史。 現在肯定存在一些新的/更好的東西嗎?

基本上,將本機 dll 復制到構建的輸出目錄的最佳方法是什么?

這實際上取決於您的客戶項目是本地項目還是托管項目。

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

  1. 假設我們有以下結構:
  • 垃圾桶
    • 贏32
      • 你的圖書館.lib
      • 你的圖書館.dll
    • x64
      • 你的圖書館.lib
      • 你的圖書館.dll
  • 包括
    • 你的lib.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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM