Вопрос

После того, как спросил этот вопрос И, очевидно, ограждая людей, как мы думаем- могу ли я дать буфер из приложения C# в C ++ DLL, а затем получить время времени в C# Просто скопируйте содержимое буфера? Таким образом, я избегаю каких -либо задержек, вызванных обратным вызовом, который, очевидно, произошел. Будет ли это работать или Marshalling предотвращает такой буферный доступ? Или мне придется перейти в небезопасную режим, и если я это сделаю или нет, каковы были бы волшебные слова, чтобы заставить его работать?

Чтобы подтвердить этот другой вопрос:

  • У меня есть драйвер, написанный в C ++ и приложение, написанное в C#.
  • Мне нужно получить данные от драйвера в стиле предварительного просмотра.
  • Приложения C ++ взаимодействуют с C ++ DLL. Приложение C# имеет большую задержку для копирования данных.
  • Задержка, по -видимому, не вызвана различиями в выпуске/отладке на стороне C#
  • Мне нужно обойти задержку. Может ли эта предложенная буферная схема работать? Может ли приложение C# потреблять из буфера, записанного C ++ DLL, или мне нужно сделать что -то еще?
Это было полезно?

Решение 4

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

Другие советы

Если вы хотите

  1. Потребляйте данные из неуправляемого кода в управляемом коде
    Тогда у вас есть проблема, если вы не потребляете ее как указатель байта (небезопасный код) или вы принимаете копию (что маршалинг сделает вас). Вероятно, последнее, что замедляет вас (но не думаю эталон).

  2. Потребляйте данные из управляемого кода в неуправляемом коде
    Тогда это довольно просто, вам просто нужно убедиться, что вы прикрепляете связанный буфер, пока он используется неуправляемым кодом.

Похоже, вы хотите сделать 1. Вы сравнивали задержку? Если это копирование (насколько велик буфер по интересам), то можете ли вы изменить свой код C#, чтобы взаимодействовать с буфером в качестве указателя байта (и длины)?
Если у вас есть доступ к C ++/CLI, вы можете часто обойти это более чисто, так как легче иметь отдельные части кода (работа с необработанным буфером), а детали, которые управляются, просто работают с его подразделениями (только копирование. Что абсолютно требуется)

По основной причине Pinvoke медленно и что использовать для решения этого. SuppressunmanagedCodeSecurityattribute.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top