У меня есть приложение на C #. Я хочу написать собственный код для некоторой части приложения c # для повышения скорости, в то время как другая часть использует приложение C #, а другая часть использует C ++ / CLI для обеспечения интерфейсов приложения C #. Поэтому для последней части мне нужно преобразовать код C # в C ++ / CLI.
Мне интересно, смогу ли я преобразовать свой код C # в код C ++ / CLI. Возможно, преобразование сборки .net в C ++ / CLI было бы лучшей идеей для получения конкретного кода. Я посмотрел на отражатель и его дополнение CppCli. Но надстройка больше не доступна. Поэтому я ищу любой способ автоматизировать это. Буду признателен за любые советы.
Вообще говоря, C ++ / CLI будет иметь примерно то же время выполнения, что и C # (оба являются управляемыми и, вероятно, будут преобразованы в один и тот же IL). Если в вашем приложении есть определенная часть, вам нужно работать быстрее, вы можете написать слой C ++ / CLI, чтобы ваше приложение C # могло взаимодействовать с некоторым собственным C ++. Это будет быстрее, если вы правильно напишите свой родной C ++.
РЕДАКТИРОВАТЬ:
Как отметил Бен Фойгт, C ++ / CLI может быть более оптимизирован, чем C #, но все же не так быстро, как хорошо написанный нативный C ++, поскольку он все еще управляем.
Если вы хотите обернуть некоторый нативный код в C ++ / CLI, тогда инструмент преобразования, вероятно, не будет структурировать его в любом случае. Вам лучше просто вручную кодировать часть взаимодействия.
Есть коммерческие инструменты там, где это делают, но я думаю, что вам все еще лучше делать это вручную.
Возможно, вам не придется конвертировать код.
link.exe, часть инструментов компилятора C ++, может включать код C ++ и C # в одну сборку. Бит C ++ может включать в себя смесь управляемого и неуправляемого кода. Сначала вы должны скомпилировать код C # в модуль .net с помощью переключателей командной строки компилятора C # (csc.exe), а затем вы можете использовать link.exe, чтобы скомпилировать его в сборку с кодом C ++. Прошло много времени с тех пор, как я создал смешанную языковую сборку, поэтому извиняюсь, если детали не на 100%, но ищите вышеупомянутые термины, и вы найдете способ сделать это.
Кажется, я помню, что ключевая часть — помнить, что компилятор C ++ более продвинут, чем другие, и поэтому может использовать сетевые модули C # / VB, но не наоборот. Я обнаружил, что преимущество компиляции в одну сборку, а не в ссылку на другую, состоит в том, что типы внутри каждой части отдельной сборки могут ссылаться друг на друга. При наличии ссылок между двумя отдельными сборками отношение осведомленности о типе должно быть иерархическим.
Существует также небезопасный ключевое слово в C #, которое позволяет использовать указатели в стиле C ++ в разделах файла кода C # и отключает проверку границ массива. Есть недостатки этого, которые могут иметь или не иметь значения в зависимости от вашего сценария использования.
Лично я обнаружил, что выполнение некоторого кода с интенсивными вычислениями было в 20 раз быстрее в компиляторе C ++ по сравнению с C # после того, как я оптимизировал его, используя указатели, доступные в C ++, что стоило усилий в моем случае.