Создать проект MS Visual C++ DLL из существующих источников

Моя цель - скомпилировать существующие классы C++ (унаследованный код, хранящийся в наборе файлов *.h) в DLL, чтобы его можно было в дальнейшем интегрировать в приложение C#.

Для этого лучше всего использовать MS Visual Studio. У меня нет опыта работы с этой средой, поэтому я попробовал наивный подход, найденный в MSDN и других ответах SO:

  • Файл | Новый | Проект из существующего кода
  • выбран Visual C++
  • выбранное расположение файла, которое является базой для включения ссылок, используемых в этих файлах .h
  • указал название проекта
  • позвольте мастеру найти и добавить все файлы C++ под каталог
  • выбран вариант «Использовать Visual Studio» для сборки с типом проекта «Проект динамически связанной библиотеки (DLL)»
  • не установил ни один из флажков ниже (ATL, MFC, CLR)
  • указанный каталог . в поле «Включить пути поиска (/ I)» в настройках отладки
  • отметили "Такая же, как конфигурация отладки" в "Настройках выпуска"
  • нажал кнопку Готово

Это создает пару файлов VS в каталоге:

mylibrary.sln
mylibrary.vcxproj
mylibrary.vcxproj.filters
mylibrary.vcxproj.user

Создав таким образом проект, я нажимаю F6 или выбираю Build | Rebuild solution из меню.

Затем я ожидаю, что сборка где-то создаст файл .dll, но он не появляется. Появляются только эти файлы:

.vs/mylibrary/v15/.suo
.vs/mylibrary/v15/Browse.VC.db
.vs/mylibrary/v15/Browse.VC.opendb
.vs/mylibrary/v15/ipch/AutoPCH/efad7c74cd39331b/EXAMPLE.ipch
Debug/mylibrary.log
Debug/mylibrary.tlog/mylibrary.lastbuildstate

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

Мои вопросы:

  • Подходит ли мой выбор MS Visual C++ для данной цели?
  • если да, то что я здесь делаю не так?

Вы не компилируете файлы .h в библиотеки. И вы не можете напрямую использовать код C++ из C#. Вы должны (во всяком случае) посмотреть, как использовать C++ / CLI.

user2100815 03.09.2018 18:44

Вы имеете в виду, что суффикс имеет значение для MS Visual C++? Я могу попробовать разделить код на .cc и .h, но я просто ожидал, что в этом нет необходимости.

Petr Kozelka 03.09.2018 18:46

Суффикс, безусловно, имеет значение в некоторых обстоятельствах, но проблема скорее в том, что типы содержимого файлов .h и .cpp обычно сильно различаются.

user2100815 03.09.2018 18:48

в моем случае файлы .h содержат полный код, включая реализацию; не очень типично, я знаю, но отлично работает на linux

Petr Kozelka 03.09.2018 18:54

Да, но вам нужно # включить эти заголовки во что-то, чтобы VS сгенерировал исполняемый файл / библиотеку - VS не компилирует файлы .h напрямую. Если он работает в Linux без вашего участия, то дизайн вашего проекта в Linux тоже неверен.

user2100815 03.09.2018 18:56

похоже, вы правы, для MSVC это действительно важно; и, по-видимому, достаточно создать один файл cpp, который включает только заголовки. Спасибо!

Petr Kozelka 04.09.2018 10:59

Не могли бы те, кто проголосовал против, объяснить, что не так с моим вопросом?

Petr Kozelka 04.09.2018 12:51

Каноническое решение сделать собственный код доступным для .NET - обернуть функциональность и предоставить интерфейс .NET. Стандартный инструмент для этого - C++ / CLI. Хотя использование довольно простое, вам нужно будет узнать о деталях. C++ / CLI в действии - полезное руководство.

IInspectable 06.09.2018 12:55

@IInspectable уверен, что это цель, которую я пытаюсь достичь

Petr Kozelka 23.09.2018 18:30

Вы не приблизитесь к этой цели, скомпилировав свой код в неуправляемую библиотеку. Вместо этого создайте сборку смешанного режима, которая может содержать как ваш неуправляемый собственный код, так и ваши .NET-потребляемые интерфейсы.

IInspectable 25.09.2018 10:18

@IInspectable у меня уже работает, плохо только то, что мне нужны 2 DLL на PATH; но ваша идея звучит интересно, я изучу, как это сделать, спасибо

Petr Kozelka 25.09.2018 13:00

Если вам нужно, чтобы расположение ваших модулей было в переменной среды PATH, вы делаете это неправильно. Вам необходимо установить все ваши зависимости в место установки вашей программы. (Есть способы обойти это, но если у вас нет причины очень хороший не развертывать ваши зависимости в месте установки, просто сделайте это.)

IInspectable 25.09.2018 13:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
12
106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Вы пропустили только экспорт тех методов, которые хотите использовать из своей библиотеки. попробуйте использовать __declspec (dllexport) с этими методами. пожалуйста, проверьте эту ссылку:

https://msdn.microsoft.com/en-us/library/a90k134d.aspx.

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

Компиляция файлов .h в библиотеки - это нормально, компилятору все равно, но пользовательский интерфейс - нет. Тем не менее, вы можете настроить это, напрямую отредактировав файл .vcxproj.

При этом убедитесь, что разделы <ClCompile> содержат:

  <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>

Обратите внимание, что вы можете использовать командную строку для создания проекта DLL:

"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" -target:Clean,Build

(это предполагает, что ваш текущий каталог - это тот, в котором находится ваш .vcxproj)

Другие вопросы по теме