Как правильно взаимодействовать с проектами C # - C ++? - PullRequest
5 голосов
/ 12 ноября 2011

Я действительно нуждаюсь в более глубоком понимании того, как правильно настроить вещи, чтобы получить элегантное взаимодействие между моими базами кода C ++ и C #.Чего я хочу добиться, так это редактора в игре, написанного на C # для моего игрового движка (C ++ / DX).Для этого я позволил VS собрать свой движок как dll C ++ с некоторыми дополнительными функциями (неуправляемый код) для доступа к необходимой функциональности моего движка из базы кода редактора C #.Пока все хорошо.

Первое, что меня беспокоит, это то, что я собираю dll с поддержкой CLR.В противном случае C # не принимает DLL по какой-то причине.Он даже не позволяет мне добавить его к ресурсам («Невозможно добавить ссылку на« C: \ Users ... \ frame_work \ Test \ frame_workd.dll ». Пожалуйста, убедитесь, что файл доступен, ичто это допустимая сборка или COM-компонент. ").

И когда я собираю dll с поддержкой CLR и добавляю ее в ссылки в C #, перестраиваю без поддержки CLR, запускаю мой редактор и вызываю функцию из dll, тогда я получаю исключение HRESULT: 0x8007007E,Я искал его, но единственное, что я нашел, было связано с зависимостями, но это не соответствует предупреждению, которое я получаю при добавлении DLL к ресурсам.

Другой момент заключается в том, что мне всегда приходится переключатьсятип конфигурации между приложением (.exe) и dll.в VS C ++, в зависимости от того, хочу ли я запускать свой движок напрямую или из редактора, и каждый раз, когда полный проект создается полностью новым.

Итак, кто-то может объяснить мне, как организовать это правильно?И что может быть причиной того, что C # хочет, чтобы dll была скомпилирована с поддержкой CLR?

Спасибо, ребята / девочки.

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Код C # является управляемым кодом (выполняется в CLR) и может только напрямую * ссылаться на управляемые сборки.Таким образом, course вы получаете ошибку при сборке на основе управляемой сборки, а затем подкрадываетесь и заменяете эту управляемую DLL на (несовместимую) неуправляемую DLL.По сути, вы пытаетесь лгать компилятору, и это обычно плохо кончается.

Если вы хотите, чтобы ваша C ++ DLL была доступна из C #, самый простой способ сделать это - создать ее какуправляемая сборка (т. е. поддержка CLR).Что вы уже делаете. Просто сделайте дополнительный шаг, чтобы заменить работающую управляемую DLL на неработающую неуправляемую.

Также:

C ++ dll с некоторыми дополнительными функциями (неуправляемый код) для доступа к необходимым функциям моего движка из редактора C #

Это не поможет, потому что C # не может напрямую * вызов неуправляемого кода.Простейшим способом сделать эту работу будет создание дополнительных управляемых классов и методов в вашей C ++ DLL.Тогда ваша сборка C # сможет напрямую использовать эти управляемые классы.

* Как отметил Спенс , вы можете использовать -indirect- means (P /Вызов и COM) для доступа к неуправляемому коду из C #.Но это сделает вашу жизнь намного сложнее, чем сейчас, не говоря уже о том, как это усложнит вашу сборку и развертывание.Вы уже очень близки к тому, что должно сработать - не добавляйте всю эту дополнительную сложность.

1 голос
/ 12 ноября 2011

При вызове функций с помощью P / Invoke вы не добавляете DLL в ресурсы проекта C # (или, что вы, вероятно, имели в виду, ссылки).

Вы добавите ее в список файлов вваш проект MSI, конечно.

1 голос
/ 12 ноября 2011

Есть два способа справиться с этим.

Либо вы заставляете свой код C ++ предоставлять API, который имеет полностью совместимый COM-объект. Если объект COM, то C # может напрямую взаимодействовать с ним. (Вот почему вы не можете добавить его как ссылку напрямую)

Однако я думаю, что то, что вы действительно хотите сделать, будет включать P / Invoke (вызов собственного кода C / C ++ из C #). Это вполне возможно, но это не всегда легко. Вам нужно иметь дело с преобразованиями между вашим C ++ API и указателями C #, и вы должны быть очень осторожны, чтобы прикреплять любые ссылки, которые ваш код C ++ записывает в приложение C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...