Как добавить внешние родные зависимости DLL?

У меня есть два проекта. Первый - это проект приложения Windows Forms, а второй - проект библиотеки классов. Проект библиотеки классов работает с FANN. Windows Forms - это проект запуска.

У меня должны быть Fann.Net.dll и fanndoubleMT.dll для работы с FANN. Я скачал эти библиотеки и поместил их в папку lib, расположенную в корне решения.

Я добавил Fann.Net.dll как внешнюю DLL в проект библиотеки классов. Я скомпилировал проект. Я получил сообщение об ошибке "Невозможно загрузить DLL" fanndoubleMT.dll ". Я исправил эту ошибку, добавив fanndoubleMT.dll в папку Windows_Forms_Application\bin\Debug.

Я думаю, что это ужасное решение проблемы, потому что я использую git, и каждый раз, когда вам нужно перенести dll в эту папку на новом рабочем месте.

С уважением, Денис.

7 ответов

Решение

Вы можете попробовать это:

  1. Добавить / Существующий элемент вместо Добавить ссылку.
  2. Используйте Добавить как ссылку.
  3. Убедитесь, что элемент должен быть скопирован в папку сборки. В свойстве библиотеки в VS задайте для параметра "Действие компоновки" значение "Содержимое", а для параметра "Копировать в выходной каталог" значение "Копировать, если новее".
  4. Готово. Перестройте и протестируйте.

Предложено в ссылке http://social.msdn.microsoft.com/Forums/en-US/1b1b316a-8648-4243-a651-84de51fd2508/reference-native-dll-from-managed-c-project?forum=vssmartdevicesvbcs.

Вы можете добавить нативный dll как связанный элемент и использовать "Копировать, если новее".
Проблема с собственными dll-файлами заключается в том, что иногда вы захотите использовать различные dll-файлы в соответствии с конфигурацией проекта (Debug/Release или platform).

Вы можете отредактировать.csproj проекта и условно связать родную dll:

 <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
    <Content Include="..\..\..\..\..\bin\Win32\Release\fanndoubleMT.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
 </ItemGroup>   
 <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
    <Content Include="..\..\..\..\..\bin\Win32\Debug\fanndoubleMT_d.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
    <Content Include="..\..\..\..\..\bin\x64\Debug\fanndoubleMT_d.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
    <Content Include="..\..\..\..\..\bin\x64\Release\fanndoubleMT.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

Обратите внимание, что опция копирования установлена ​​в PreserveNewest, что означает "копировать, если новее".

Вышеупомянутое решение, написанное liang, работает только для плоской структуры проекта! Вы можете организовать все свои библиотеки DLL в своем решении в одну папку с именем "Зависимости". Но имейте в виду, что файлы копируются относительно структуры проекта в обозревателе решений. (протестировано с Visual Studio 2015)

  1. Создайте зависимости папок в обозревателе решений
  2. Добавить / Существующий элемент вместо Добавить ссылку.
  3. Используйте Добавить как ссылку.
  4. В свойстве библиотеки в VS задайте для параметра "Действие компоновки" значение "Содержимое", а для параметра "Копировать в выходной каталог" значение "Копировать, если новее".

Теперь у вас должна быть следующая структура Solution Explorer:

Your Project
- class1.cs
- Dependencies\Fann.Net.dll
- Dependencies\fanndoubleMT.dll

Добавить шаг после сборки:

xcopy "$(TargetDir)\Dependencies" "$(TargetDir)"  /s /e /h /Y

Это решение, сочетающее добавление файлов в проект и создание шага после сборки, имеет следующие преимущества:

  • Проект хорошо организован
  • Нет необходимости изменять шаг после сборки, если кто-то позже добавит новую зависимость в обозреватель решений,
  • Если вы используете Subversion, он сбросит флаг только для чтения заблокированного файла в хранилище

Вы не можете добавить ссылку на неуправляемые библиотеки. Одним из решений является добавление события Post Build в ваш проект Windows Forms. Что-то вроде: xcopy ..\lib\fanndoubleMT.dll $(TargetPath) Событие после сборки может также выполнить файл.cmd или.bat

Вам по-прежнему нужна ссылка на управляемую сборку Fann.Net.dll.

Если dll отсутствует в файле bin проекта, вы должны разрешить копирование dll.

  1. Щелкните правой кнопкой мыши на вашей DLL

  2. Нажмите свойства

  3. Если Копировать в выходной каталог не копировать, выберите Копировать всегда

  4. Перестройте проект. Это появится.

В моем случае мне нужно нажать кнопку обзора на вкладке «Сборка», чтобы найти мои DLL.

  1. Щелкните правой кнопкой мыши на вашем проекте
  2. Выберите Добавить, затем Ссылка...
  3. В окне "Диспетчер ссылок" нажмите "Обзор..." (расположен внизу).
  4. Найдите свой.dll и затем нажмите Добавить.
Другие вопросы по тегам