Взаимодействие между проектом С# и проектом С++ в том же решении
У меня есть приложение для форм 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 в С++