Можно ли создавать объекты C ++ из C #?

В настоящее время я работаю над проектом Game, поэтому я занимаюсь разработкой своего редактора на C #, потому что это займет много времени на C ++, поэтому для эффективности я использую C # в качестве основного языка редакторов, чтобы быстро получить результаты.

Однако возможно ли создать редактор игр в C #, который создает объекты C #, которые могут быть прочитаны C ++, или редактор игр в C #, который создает объекты C ++, которые можно использовать в C ++?

Это связано с тем, что C # является средой RAD, поэтому она быстро разрабатывает приложение для Windows, но C ++ / DirectX, вероятно, лучшая среда для игры.

Есть ли способ объединить их, так как они оба являются частью .NET Framework?

2

Решение

В прошлом я успешно использовал C ++ / Cli для создания объекта C ++ из C #.
По сути, вы можете создать C ++ (управляемую) библиотеку, которая загружает / создает объекты c / c ++ (неуправляемые). Чем вы можете использовать эту управляемую библиотеку из управляемой (c # / vb) библиотеки / приложения.
Помните о следующем:

  • C ++ / cli может быть собран только для конкретной платформы (x86 / x64), поэтому вам нужно будет соответственно создать свой управляемый редактор
  • Visual Studio 2012 не поддерживает intellisense для C ++ / cli, если Microsoft не очень нравится этот сценарий

Также COM и p / invoke являются жизнеспособными альтернативами.

2

Другие решения

Связь между C # и C ++ (или между любым управляемым и неуправляемым языком) — это боль в заднице, и, если у вас нет очень веских причин для использования, ее следует избегать.

Для связи вы можете использовать каналы, WCF, COM, P / Invoke и некоторые другие пользовательские коммерческие опции. Вы можете искать в сети для этого. В движке, над которым я работал, мы используем анонимный MemoryStream, совместно используемый несколькими процессами.

Но проблема, которая всегда возникает снова, заключается в том, что для любых структурных изменений в C ++ вам необходимо отразить их в C #. Например, если вы измените параметр, который принимает метод, или определение структуры. Существует какое-то решение, позволяющее автоматически «лепить» ваш C #, чтобы всегда быть в курсе C ++, но они дорогостоящие и тяжелые для реализации.

Теперь, почему вы не должны беспокоиться! Правда, вы не найдете высокопроизводительный коммерческий движок в чем-то еще, кроме C ++. Нереально? C ++. Источник? C ++. Crysis? C ++. Потому что C ++ дает производительность, которую не может предложить ни один управляемый язык. Это также позволяет напрямую контролировать память и микро контроль над тем, как объекты создаются и стираются.

Итак, почему вы не должны заботиться? Потому что, если только вы не планируете выпустить тройную игру A размером или диапазоном Assassin’s Creed, Half-Life или Skyrim, C # в рамках XNA Framework даст много места и производительности. Гораздо больше, чем нужно. Если у вас действительно есть проблема с производительностью, то, скорее всего, проблема не в управляемом языке, и в вашем коде еще должно быть много оптимизаций. Скорее всего, если у вас есть проблемы с производительностью в C #, они будут и в C ++.

XNA также дает возможность поставлять на Windows, Xbox и различных портативных устройствах Microsoft. Кроме того, использование DirectX в любом случае ограничит вас этой платформой.

1

Можно ли создавать объекты C ++ из C #?

Не напрямую. Для начала, я не думаю, что вы можете вызвать конструктор, используя P / Invoke; вам всегда нужно будет экспортировать специальную «оболочку конструктора», например:

extern "C" {
EXPORT_API YourClass* YourClassInstanceFactory()
{
return new YourClass();
}
}

Для последующего thiscalls, вам, вероятно, нужно отслеживать все украшенные имена, которые могут изменяться каждый раз, когда вы компилируете свою библиотеку.

Вы можете создать библиотеку оболочки в C ++, которая extern Вспомогательные функции C должны быть платформой Вызывается через C #, но, опять же, я не совсем уверен в накладных расходах, которые это может добавить, и я полагаю, что вас беспокоит производительность.

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector