Как настроить файл MyPackage.targets для добавления всех DLL в папку bin / debug или bin / Release? - PullRequest
1 голос
/ 03 июня 2019

Я изучаю 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 »или одну из ее зависимостей. Указанный модуль не найден. '

Если я вручную скопирую DLL из папки x64 в папку bin / Debug, приложение запустится.

Как мне структурировать файл .targets, чтобы скопировать все dll, которые есть в build / x64, в bin / Debug или bin / release?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Для нативных DLL всегда всегда обязательно устанавливайте свойство <OutDir>. Это определяет, где будет скомпилированный двоичный файл. Это будет выглядеть примерно так:

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

Обратите внимание, что он также должен заканчиваться обратной косой чертой.

Для управляемых DLL всегда всегда обязательно устанавливайте свойство <OutputPath>. Это определяет, где будет находиться скомпилированная управляемая сборка. Это будет выглядеть примерно так:

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

Заметили, что они оба ходят в одно и то же место?

1 голос
/ 03 июня 2019

У меня была похожая проблема.Я решил это с помощью функции «Копировать».См. Пример ниже:

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

Полный код доступен здесь .

...