Работа со строками между C# и C++

У меня есть проблема, которая, я думаю, очень распространена среди разработчиков низкого уровня, которые начинают работать с языками высокого уровня. Я провел некоторое исследование, но не нашел подходящего решения для своей проблемы.

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

Если пакеты содержат только неуправляемые типы (byte, int и т. д.), все должно быть в порядке, но моя проблема возникает, когда мне приходится работать со строками между управляемым клиентом на C# и неуправляемым сервером на C/C++.

Я уже нашел несколько решений этой проблемы, но я действительно не знаю, какое из них лучше или есть лучшее решение, которого я не заметил.

Первый подход заключается в использовании ключевого слова fixed для создания структур, представляющих каждый пакет приложения, и при этом C# позволяет мне легко и с очень низкими затратами (я думаю) выполнять приведение указателей (от byte* к packet_structure* и наоборот) не беспокоясь обо всех маршалингах и других дорогостоящих методах. Я думаю, что этот подход особенно плох, потому что заставляет меня использовать тип данных sbyte в буферах, где должна быть строка в пакете, а затем выполнять приведение, чтобы передать эти байты в управляемый мир для правильной обработки.

Другой подход, который я сделал, заключался в том, чтобы объявить структуру каждого пакета управляемой, но помеченной атрибутами MarshalAs, чтобы использовать методы Marshal для преобразования данных. Такой подход я считаю более затратным, учитывая, что приложение — это игра, а клиент, который я делаю, — это приложение реального времени. Я думаю, что широкое использование маршалинга для каждого пакета может быть очень дорогим для приложения.

Есть ли какое-нибудь простое и красивое решение, которому я мог бы следовать, что-то вроде стиля C или любого другого решения, в котором мне отказывает моя неопытность? В C очень простого приведения указателя должно быть достаточно, чтобы избавить меня от проблем.

Я влюблен в C#, но я очень боюсь, что не смогу сделать это с этой платформой :(

Кто-нибудь может пролить свет? :/

Большое спасибо за ваше время, любая помощь будет ОЧЕНЬ оценена.


person André Oliveira    schedule 26.02.2015    source источник
comment
Этот подход, на мой взгляд, более затратный... Я предлагаю вам потратить некоторое время на его профилирование! Вы действительно рассматриваете возможность усложнить свой код только из-за интуиции, что простое и наиболее читаемое (и, следовательно, наименее подверженное ошибкам) ​​решение может быть слишком медленным ?   -  person Heinzi    schedule 26.02.2015
comment
Связано: stackoverflow.com/q/878073/87698   -  person Heinzi    schedule 26.02.2015
comment
@Heinzi, спасибо за ответ. Я прочитаю тему, которую вы присылаете прямо сейчас.   -  person André Oliveira    schedule 26.02.2015
comment
@Heinzi Я только что прочитал тему и ... Что ж, я буду следовать вашему руководству, чтобы профилировать код и найти лучший способ. Цель этой темы - просто обобщить знания по теме. Поскольку я еще не эксперт по С#, я подумал, что люди здесь могут указать другой способ, которого я не видел. Большое спасибо за быстрый ответ =]   -  person André Oliveira    schedule 26.02.2015
comment
Вы можете заставить его работать. Нет, это огромная ошибка, когда самый низкий уровень диктует, как это работает. Мы живем в эпоху Интернета, это вполне решаемая проблема. Поднимите нижний уровень, нет причин избегать использования XML или Protobuf в C++ сегодня.   -  person Hans Passant    schedule 26.02.2015
comment
Привет Ганс. Проблема использования XML или Protobuf, как вы сказали, заключается в том, что невозможно изменить серверное приложение, поэтому я застрял с фактическим протоколом пакетов без использования сериализации (что может решить мою проблему). Но да, возможно, я слишком много думаю об обработке, idk ;x Большое спасибо за ответ.   -  person André Oliveira    schedule 26.02.2015