Целевой файл для развертывания файлов nativs в выходной каталог - PullRequest
0 голосов
/ 10 марта 2020

У меня есть nuget со следующей структурой:

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

Я добавляю этот nuget в один из моих проектов. Всякий раз, когда я строю этот проект, я ожидаю, что ВСЕ dll будут скопированы в выходной каталог. Тем не менее, копируется только «MyDll.dll», а все библиотеки DLL из собственной папки Runtime - нет. Я видел этот пост, который объясняет, как использовать файл .targets для выполнения sh этого: Добавление собственных файлов из пакета NuGet в выходную директорию проекта . Однако я не могу найти конкретную информацию о том, как добавить файл .targets, и этому посту 6 лет. Конечно, что-то новое / лучшее существует к настоящему времени?

Как лучше всего скопировать нативные библиотеки DLL в выходной каталог сборки?

1 Ответ

0 голосов
/ 27 апреля 2020

Это действительно зависит от того, является ли ваш клиентский проект собственным или управляемым.

Если ваш проект является собственным, вам нужно сделать следующее:

0) Предположим, у нас есть следующее структура:

  • bin
    • Win32
      • yourlibrary.lib
      • yourlibrary.dll
    • x64
      • yourlibrary.lib
      • yourlibrary.dll
  • include
    • yourlib.h
  • YourPackage.nuspe c
  • YourPackage.targets

1) YourPackage.nuspe c файл, который содержит что-то вроде этого:

<?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>

2) Затем добавьте файл .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>

3) После всего этого запустите в каталоге пакета: nuget pack YourPackage.nuspec Это создаст новый пакет nuget, который после Потребление в нативных проектах должно работать.

Важное замечание: у меня это сработало, но иногда загрузка клиентского проекта в VS не удалась.

...