Моя цель - скомпилировать существующие классы C++ (унаследованный код, хранящийся в наборе файлов *.h) в DLL, чтобы его можно было в дальнейшем интегрировать в приложение C#.
Для этого лучше всего использовать MS Visual Studio. У меня нет опыта работы с этой средой, поэтому я попробовал наивный подход, найденный в MSDN и других ответах SO:
.h. в поле «Включить пути поиска (/ 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++? Я могу попробовать разделить код на .cc и .h, но я просто ожидал, что в этом нет необходимости.
Суффикс, безусловно, имеет значение в некоторых обстоятельствах, но проблема скорее в том, что типы содержимого файлов .h и .cpp обычно сильно различаются.
в моем случае файлы .h содержат полный код, включая реализацию; не очень типично, я знаю, но отлично работает на linux
Да, но вам нужно # включить эти заголовки во что-то, чтобы VS сгенерировал исполняемый файл / библиотеку - VS не компилирует файлы .h напрямую. Если он работает в Linux без вашего участия, то дизайн вашего проекта в Linux тоже неверен.
похоже, вы правы, для MSVC это действительно важно; и, по-видимому, достаточно создать один файл cpp, который включает только заголовки. Спасибо!
Не могли бы те, кто проголосовал против, объяснить, что не так с моим вопросом?
Каноническое решение сделать собственный код доступным для .NET - обернуть функциональность и предоставить интерфейс .NET. Стандартный инструмент для этого - C++ / CLI. Хотя использование довольно простое, вам нужно будет узнать о деталях. C++ / CLI в действии - полезное руководство.
@IInspectable уверен, что это цель, которую я пытаюсь достичь
Вы не приблизитесь к этой цели, скомпилировав свой код в неуправляемую библиотеку. Вместо этого создайте сборку смешанного режима, которая может содержать как ваш неуправляемый собственный код, так и ваши .NET-потребляемые интерфейсы.
@IInspectable у меня уже работает, плохо только то, что мне нужны 2 DLL на PATH; но ваша идея звучит интересно, я изучу, как это сделать, спасибо
Если вам нужно, чтобы расположение ваших модулей было в переменной среды PATH, вы делаете это неправильно. Вам необходимо установить все ваши зависимости в место установки вашей программы. (Есть способы обойти это, но если у вас нет причины очень хороший не развертывать ваши зависимости в месте установки, просто сделайте это.)





Я думаю, что ваши шаги, вероятно, верны, и я думаю, что это правильный подход к использованию кода из приложения 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)
Вы не компилируете файлы .h в библиотеки. И вы не можете напрямую использовать код C++ из C#. Вы должны (во всяком случае) посмотреть, как использовать C++ / CLI.