Взаимодействие между проектом С# и проектом С++ в том же решении

У меня есть приложение для форм Windows, написанное на С++/cli. Я хочу расширить это приложение с помощью некоторых новых форм, и я хотел бы создать их на С# в отдельном проекте.

Можно ли просто добавить проект С# к решению, имеющему проект С++, и оба будут взаимодействовать? Посредством взаимодействия, я имею в виду, что, скажем, кнопка, нажатая на форме, написанной в проекте С#, сможет вызывать методы в проекте С++. На вопрос, возможно, по-другому, может ли объект в проекте С# ссылаться на объект в проекте С++? если да, знаете ли вы пример кода, чтобы начать меня?

Спасибо.

Ответ 1

Да. Приложение С++/CLI сможет взаимодействовать с приложением С# одним из двух способов:

Если вы используете расширения CLI (что из вашего сообщения это похоже на него), вы сможете писать код с использованием новых ссылок на объекты:

Управляемые объекты: System::String^ myString (в С++) совпадает с string myString в С# Управляемые ссылки: System::String% myString эквивалентно ref string myString.

Если вы хотите использовать родные типы С++, вам придется использовать P/Invoke, но это совершенно другая категория. Для того, что вы хотите сделать, просто добавьте проект С++ в качестве ссылки на ваш проект С#, напишите общедоступный класс на С++ с использованием управляемых типов и затем скомпилируйте. Затем ваш проект должен быть видимым для вашего класса С# в любом пространстве имен, которое вы выбрали для класса С++.

EDIT: oh, и если вам нужно выделить управляемые объекты через С++, вам нужно будет использовать gcnew вместо new.

Ответ 2

Это можно сделать, скомпилировав dll с проектом С++, а затем загрузив приложение С# в эту DLL, а затем он сможет вызвать свои экспортированные функции. Этот метод позволяет вашему коду С++ быть неуправляемым кодом.

Что касается поиска образца, который уже настроен, я могу найти только проект Visual Studio 2008: Microsoft All-In-One Code Framework

Для visual studio 2010 здесь, как сделать С++: Как сделать dll с С++ Использование Явного PInvoke в С++