Как добавить внешние родные зависимости 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 ответов
Вы можете попробовать это:
- Добавить / Существующий элемент вместо Добавить ссылку.
- Используйте Добавить как ссылку.
- Убедитесь, что элемент должен быть скопирован в папку сборки. В свойстве библиотеки в VS задайте для параметра "Действие компоновки" значение "Содержимое", а для параметра "Копировать в выходной каталог" значение "Копировать, если новее".
- Готово. Перестройте и протестируйте.
Предложено в ссылке 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)
- Создайте зависимости папок в обозревателе решений
- Добавить / Существующий элемент вместо Добавить ссылку.
- Используйте Добавить как ссылку.
- В свойстве библиотеки в 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.
Щелкните правой кнопкой мыши на вашей DLL
Нажмите свойства
Если Копировать в выходной каталог не копировать, выберите Копировать всегда
Перестройте проект. Это появится.
В моем случае мне нужно нажать кнопку обзора на вкладке «Сборка», чтобы найти мои DLL.
- Щелкните правой кнопкой мыши на вашем проекте
- Выберите Добавить, затем Ссылка...
- В окне "Диспетчер ссылок" нажмите "Обзор..." (расположен внизу).
- Найдите свой.dll и затем нажмите Добавить.