Структура / архитектура приложения, использующего различные языки программирования
У меня есть рабочий проект на c++, использующий библиотеку, выполненную на c++ и частично на c.
Теперь у меня есть прецедент, когда мне нужно взаимодействовать с (исправлено после обнаружения недоразумения) мой проект на c++ использует эта библиотека из c#.
Я просто добавил файлы и необходимые #includes в свой первый проект, а затем написал свой код, используя непосредственно функциональность lib, вот почему я выбрал C++ в первую очередь, чтобы облегчить взаимодействие с ним.
Я немного исследовал и, основываясь на нескольких вещах, которые я нашел, думаю, что самый простой способ сделать это с наименьшим количеством изменений в исходной библиотеке-это использовать оболочку в CLI.
Но быть честным...
Я никогда не делал этого раньше, и я еще не пробовал много вещей, потому что я не хочу терять время, которого у меня нет. Я хотел бы знать, можно ли это сделать так, как я думаю, или есть лучший способ сделать это. Поэтому "что вы пробовали" ниже следует переименовать - а ты что подумал?" в этом случае...
Я использую Visual Studio 2017 professional
Что я уже пробовал:
Я думаю об одном VS-решении с 3 проектами.
Проект 1: C++
Библиотечные файлы (2x .cpp, 8x .h и 1x .c)
MyAlreadyWorkingCode (1x .cpp, 1x .h)
MyNewConnectingCodeForCli (1x .cpp, 1x .h)
Проект 2: CLI
CallerForCpp (1x .cpp, 1x .h)
Проект 3: WPF
Приложение myapp.XAML-код, приложение.в CS
ExternalTriggersManagement.в CS
CallerForCLI.в CS
###############################################
- Приложение будет в основном реагировать на внешние триггеры (начало процесса и конец процесса), а графический интерфейс будет в основном использоваться для отображения информации о текущем и предыдущем процессе.
- В случае завершения процесса внешнего триггера (или ручного запроса / щелчка от пользователя при определенных обстоятельствах) будет вызвана соответствующая функция в CallerForCLI.cs
- CallerForCPP получит вызов из c# и переадресует его в MyNewConnectingCodeForCLI
- MyNewConnectingCodeForCLI затем будет использовать мои уже работающие функции c++, чтобы использовать библиотеку и генерировать желаемый результат.
Вещи, в которых я еще не уверен на 100% :
- Я должен объявить функции в MyNewConnectingCodeForCLI.h с помощью
__declspec
чтобы быть видимым снаружи но если я это сделаю #include MyAlreadyWorkingCode.h
в самом деле MyNewConnectingCodeForCLI.cpp я должен иметь возможность использовать свою существующую функциональность как обычно, не меняя уже работающий код. Или я ошибаюсь?- Проект CLI должен быть настроен как динамическая библиотека и с поддержкой CLR. И я полагаю, что проект CPP тоже
- Я должен скомпилировать, чтобы быть "загруженным с задержкой", используя флаг компоновщика от CLI до CPP, чтобы избежать неразрешенных зависимостей, а затем загрузить / инициализировать cpp.dll внутри CLI перед использованием его функциональности
[ДОБАВЛЕН]
- Одна из немногих вещей, которые мне нужно переместить с c# на c++, - это строка, поэтому мне нужно будет ее Маршалировать. В настоящее время я использую CString в c++, я мог бы изменить его, чтобы повысить совместимость. Как вы думаете, что было бы наиболее совместимым использованием для снижения сложности в маршале?
Как вы думаете, это хороший подход?
Комментарии и исправления приветствуются.
---------
Добавление после решения № 1 и №2:
Ссылка, которая заставила меня спросить о вышеупомянутой структуре, такова: Использование C++ в C# на примере « блог программирования[^]. Похоже, что он не использует "стандартные" способы. О чем вы думаете?
РЕДАКТИРОВАТЬ:
Я думаю, что этот метод может сработать, если все исходные коды находятся в одном решении и могут быть скомпилированы вместе. Но я никогда его не видел. Поэтому я и спросил.
Я нашел еще одну ссылку здесь, в CP, говорящую о обертывании c++ с cli: Быстрый C++/CLI - изучите C++/CLI менее чем за 10 минут[^]
--------
2-е дополнение после комментариев и редактирования Ричарда
Мое решение на языке C++ генерирует файл и заполняет его данными, полученными в ходе процесса. Он имеет свою собственную систему регистрации и другие функции.
Теперь я должен использовать часть его функциональности в другом месте, где имя файла зависит от другой системы. Я хочу, чтобы мое новое приложение на C# получало необходимую информацию из другой системы (программное обеспечение поставщика, отсутствие доступа к коду и очень ограниченные возможные изменения), составляло имя файла и отправляло его в проект C++ (один из немногих данных, подлежащих обмену), где он будет использоваться для создания соответствующего файла с необходимым содержимым.
По мере того как я продолжаю читать об этой теме и из-за некоторых комментариев ниже, я начинаю думать, что переписывание моего проекта C++ и полное преобразование его в DLL могут иметь свои преимущества в отношении переносимости и удобства использования другими созвездиями. Если нет, то мне, возможно, придется поддерживать параллельные проекты с одними и теми же источниками, если это будет успешно и использование распространится