Можно ли создавать объекты C++ из C#?
В настоящее время я работаю над проектом Game, поэтому я занимаюсь разработкой своего редактора на C#, потому что на C++ потребуется много времени, поэтому для эффективности я использую C# в качестве основного языка редакторов, чтобы быстро получить результаты.
Однако возможно ли создать редактор игр в C#, который создает объекты C#, которые могут быть прочитаны C++, или редактор игр в C#, который создает объекты C++, которые можно использовать в C++?
Это связано с тем, что C# является средой RAD, поэтому она быстро разрабатывает приложение для Windows, но C++/DirectX, вероятно, является лучшей средой для игры.
Есть ли способ объединить эти два, так как они оба являются частью.NET Framework?
3 ответа
В прошлом я успешно использовал C++ / Cli для создания объекта C++ из C#. По сути, вы можете создать C++ (управляемую) библиотеку, которая загружает / создает объекты c / C++ (неуправляемые). Чем вы можете использовать эту управляемую библиотеку из управляемой (C#/vb) библиотеки / приложения. Помните о следующем:
- C++ / cli может быть собран только для конкретной платформы (x86/x64), поэтому вам нужно будет соответственно создать свой управляемый редактор
- Visual Studio 2012 не поддерживает intellisense для C++ / cli, если Microsoft не очень нравится этот сценарий
Также COM и p/invoke являются жизнеспособными альтернативами.
Связь между C# и C++ (или между любым управляемым и неуправляемым языком) - это боль в заднице, и если у вас нет очень веских причин для использования, ее следует избегать.
Для связи вы можете использовать каналы, WCF, COM, P/Invoke и некоторые другие пользовательские коммерческие опции. Вы можете искать в сети для этого. В движке, над которым я работал, мы используем анонимный MemoryStream, совместно используемый несколькими процессами.
Но проблема всегда заключается в том, что для любых структурных изменений в C++ вам необходимо отразить их в C#. Например, если вы измените параметр, который принимает метод, или определение структуры. Существует какое-то решение, позволяющее автоматически "лепить" ваш C#, чтобы всегда быть в курсе C++, но они дорогостоящие и тяжелые для реализации.
Теперь, почему вы не должны беспокоиться! Правда, вы не найдете высокопроизводительный коммерческий движок в чем-то еще, кроме C++. Нереально? C++. Источник? C++. Crysis? C++. Потому что C++ дает производительность, которую не может предложить ни один управляемый язык. Это также позволяет напрямую контролировать память и микро контроль над тем, как объекты создаются и стираются.
Итак, почему вы не должны заботиться? Потому что, если только вы не планируете выпустить тройную игру А размером или диапазоном Assassin's Creed, Half-Life или Skyrim, C# в рамках XNA Framework даст много места и производительности. Гораздо больше, чем нужно. Если у вас действительно есть проблема с производительностью, то, скорее всего, проблема не в управляемом языке, и в вашем коде должно быть много оптимизаций. Скорее всего, если у вас есть проблемы с производительностью в C#, они будут и в C++.
XNA также дает возможность поставлять на Windows, Xbox и различных портативных устройствах Microsoft. Кроме того, использование DirectX в любом случае ограничит вас этой платформой.
Можно ли создавать объекты C++ из C#?
Не напрямую. Для начала, я не думаю, что вы можете вызвать конструктор, используя P/Invoke; вам всегда нужно будет экспортировать специальную "оболочку конструктора", например:
extern "C" {
EXPORT_API YourClass* YourClassInstanceFactory()
{
return new YourClass();
}
}
Для последующего thiscall
s, вам, вероятно, нужно отслеживать все украшенные имена, которые могут изменяться каждый раз, когда вы компилируете свою библиотеку.
Вы можете создать библиотеку оболочки в C++, которая extern
Вспомогательные функции C должны быть платформой Вызывается через C#, но, опять же, я не совсем уверен в накладных расходах, которые это может добавить, и я полагаю, что вас беспокоит производительность.
Другим решением может быть создание библиотеки-оболочки C++/CLI (CLR Class Library), на которую можно напрямую ссылаться в C#. Преимущество этого подхода в том, что вы можете ссылаться на нативные библиотеки так же, как в обычном проекте C++.