В основном у меня есть куча неуправляемых статических библиотек VC++. И приложение с графическим интерфейсом пользователя VC++, которое их использует, и основано на MFC. Цель состоит в том, чтобы заменить приложение с графическим интерфейсом на приложение, написанное на C#, но с использованием тех же статических библиотек. Вопрос в том, возможно ли это вообще, и если да, то как правильно это сделать?
Есть предложения? Спасибо.





Да, возможно использование C++ / CLI для управляемого кода C++. Вы должны написать приложение WinForms на C++ / CLI и просто связать свою статическую библиотеку как обычно.
Однако, если между кодом графического интерфейса и библиотеками существует тесная связь, это может стать немного запутанным. Вам нужно будет позаботиться о преобразовании некоторых типов данных между управляемым и неуправляемым миром, особенно строк. Если вам нужно передать управляемые объекты / массивы
Есть хорошее введение в Википедия и много документации по MSDN.
Управляемый класс не может наследовать напрямую от неуправляемого класса, но вы можете реализовать неуправляемые классы в своем приложении, которые наследуются от классов библиотеки и действуют как прокси для ваших управляемых классов.
Роб прав - вы можете сделать это полностью на C++ / CLI, но мы сочли наиболее полезным обернуть некоторые собственные классы в управляемый класс пользовательского элемента управления WinForms. Этот управляемый класс содержал экземпляр собственного класса и не только упорядочивал данные, такие как строки в вызовах методов, но также преобразовывал собственные обратные вызовы (реализованные с помощью boost :: signal) в события .NET. Полное решение для преобразования сигнала в событие изложено в этот вопрос. Пользовательский элемент управления .NET WinForms также перехватывает собственные исключения и повторно генерирует их как управляемые исключения, а также выполняет некоторую трансляцию интерфейса, отличного от .NET (методы, возвращающие итераторы), в интерфейс, более ориентированный на .NET, о котором вы можете прочитать в этот вопрос. Затем мы смогли использовать класс .NET непосредственно в приложении WPF. Обратите внимание: если вы оберните его как класс .NET, он должен будет войти в библиотеку DLL, которая будет использоваться из C#.
Уловка также заключается в том, что приложение с графическим интерфейсом пользователя должно расширять некоторые объекты из этих статических библиотек, чтобы иметь возможность реагировать на некоторые методы обратного вызова, вызываемые из библиотек. Это сработает?