Преобразование неуправляемого в управляемый во время процесса прыжка - PullRequest
0 голосов
/ 11 января 2010

Во-первых, я хочу поблагодарить Мэтта Дэвиса за этот пост . Я знаю, что этот пост не был выбран в качестве ответа на этот конкретный вопрос, но этот пост был чрезвычайно полезным для меня. У меня была пара небольших проблем, которые нужно было исправить (в основном это изменение пути к файлу в предоставленном им коде), но я легко смог создать неуправляемый клиент C ++ для службы C # WCF, используя метод моста C ++.

Сейчас я изучаю, как улучшить базовые концепции, представленные там. Вот фрагмент кода из файла HelloServiceClientBridge.cpp в сообщении Мэтта:

String^ message = client->SayHello(gcnew String(name)); 
client->Close(); 
IntPtr ptr = Marshal::StringToHGlobalAnsi(message); 
rv = std::string(reinterpret_cast<char *>(static_cast<void *>(ptr)));

Похоже, здесь будет создано много копий строки. Вот все потенциальные места, которые я вижу, где можно сделать копию строки:

  • Исходная неуправляемая копия строки в переменной name
  • Управляемая копия строки при вызове gcnew String(name)
  • Я не уверен, но другая копия может быть создана, когда управляемая строка передается в качестве параметра методу SayHello()
  • Строка копируется в сообщение WCF, которое отправляется службе C #
  • Я не уверен, но при получении сообщения служба C # может создать еще одну копию
  • Я думаю, что другая копия строки создается, когда String.Format называется
  • Новая строка "Hello" копируется в сообщение WCF, которое отправляется клиенту
  • Я не уверен, но клиент C # может создать еще одну копию при получении сообщения
  • Я не уверен, но другая копия может быть создана, когда клиент C # возвращает строку в мост C ++
  • Неуправляемая копия новой строки создается при вызове Marshal::StringToHGlobalAnsi(message)
  • Я не уверен, но при преобразовании строки в std::string

Теперь я понимаю, что некоторое копирование неизбежно, когда мы работаем с неуправляемым и управляемым взаимодействием и межпроцессным взаимодействием, но мне интересно, можно ли избежать этого копирования. Это не имеет большого значения для простого примера типа HelloWorld, но стоимость копирования из неуправляемого в управляемый, а затем из одного процесса в другой может быть значительной, если передается большой объем данных. Итак, мне интересно, есть ли способ сделать сортировку от неуправляемой до управляемой и / или наоборот в то же время, когда происходит межпроцессное взаимодействие.

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

Еще одна возможность, которую я рассмотрел, - передача неуправляемого указателя из процесса C ++ в службу C # через сообщение WCF, которое затем может быть преобразовано в управляемую строку службой C #. Конечно, это может быть довольно запутанным, выясняя, кто отвечает за выделение памяти и освобождение памяти для этого указателя, но копирование будет уменьшено, а размер сообщения WCF может быть значительно уменьшен.

Спасибо за любые ваши идеи!

1 Ответ

0 голосов
/ 15 января 2010

Я начал изучать WWSAPI как способ создания клиента C ++ для службы WCF. Пока что похоже, что это решение работает довольно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...