Можно ли создавать объекты 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();
    }
}

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

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

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

Другие вопросы по тегам