Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
.NET 2.x

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода

30.12.2010, 11:35. Показов 4911. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть COM интерфейс с методом:
C++
1
2
3
  virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnReceivePacket( 
            /* [in] */ long dwSize,
            /* [size_is][in] */ BYTE __RPC_FAR *Data) = 0;
на C# он выглядит так:
C#
1
void OnReceivePacket(int dwSize, ref byte Data);
этот интерфейс используется для асинхронного получения данных от COM объекта.
раньше реализация была такая:
C#
1
2
3
4
5
6
7
8
9
10
11
12
  unsafe public void OnReceivePacket(int dwSize, ref byte Data)
  {
       byte[] bData = new byte[dwSize];
       fixed (byte* pData = &Data)
       {
           Marshal.Copy(new IntPtr(pData), bData, 0, dwSize);
       }
       //.....
       // Обработка данных из bData
       //.....
 
   }
все было хорошо, до того момента пока не столкнулись с проблемой запуска приложения с сетевой шары, по умолчанию запрещена загрузка неуправляемого кода :-(

Подскажите как сделать новую реализацию этого метода без использования unsafe?
Как преобразовать ref byte в byte[] или в IntPtr
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.12.2010, 11:35
Ответы с готовыми решениями:

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции. Вот пример кода, который нужно справить: ...

Пердача byte[] COM-функции, ожидающей ref byte
Привет, наше приложение в C# использует несколько COM-интерфейсов. В одном из них есть метод, которому передается ref byte : ...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы Проблемы c процедурами Pos и Chang: пос...

4
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.12.2010, 16:47
real_vadim, попробуй так:
C#
1
2
3
4
5
6
7
        public void OnReceivePacket ( int dwSize, IntPtr Data ) {
            byte[] bData = new byte[dwSize];
            Marshal.Copy(Data, bData, 0, dwSize);
            //.....
            // Обработка данных из bData
            //.....
        }
Либо замени IntPtr на ref IntPtr, хотя должно работать с IntPt, т.к. это void *, а ref IntPtr - void **.
0
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
30.12.2010, 16:50  [ТС]
Дело в том что интерфейс фиксированный, и поменять тип аргумента не могу
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.12.2010, 17:14
Попробуй так:
C#
1
2
3
4
5
6
7
8
        public void OnReceivePacket ( int dwSize, ref byte Data ) {
            byte[] bData = new byte[dwSize];
            for (int i = 0; i < 0; i++)
                bData[i] = Marshal.ReadByte(Data, i);
            //.....
            // Обработка данных из bData
            //.....
        }
Но как пальцем в небо, проверить работоспособность негде. Да и сомневаюсь что внутри ReadByte берется указатель на Data, так что скорее всего bData будет == 0.

Без unsafe никак.
0
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
30.12.2010, 17:40  [ТС]
Идея конечно не плохая, но в результате получается мусор :-(
вернее первый элемент совпадает, а дальше непонятные числа
использовал вот этот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Program
{
    static void Main(string[] args)
    {
        byte[] temp = new byte[] { 1, 2, 3, 4, 5 };
        byte[] data = Read(temp.Length, ref temp[0]);
        for (int i = 0; i < data.Length; i++)
        {
            Console.WriteLine(data[0]);
        }
    }
 
    public static byte[] Read(int dwSize, ref byte pData)
    {
        byte[] data = new byte[dwSize];
        for (int i = 0; i < dwSize; i++)
        {
            data[i] = Marshal.ReadByte(pData, i);
        }
        return data;
    }
}
видимо это происходит из-за упаковки примитивных типов

Добавлено через 6 минут
Тогда другой вопрос, как можно изменить автоматически сгенерируемые интерфейсы COM объектов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.12.2010, 17:40
Помогаю со студенческими работами здесь

Преобразовать String в Byte[] без использования Encoding
Всем доброго времени суток :) В общем возникла &quot;проблема&quot; имеем код - byte Send = new byte { 0xFF, 0xFF, 0xFF, 0xFF, (byte)'r',...

Как преобразовать IntPtr в изображение, а после в byte[]?
Суть в том, что я хочу выбирать PSD файл, преобразовывать его сразу в картинку и отправлять в обменик Есть метод GetHBitmap(),...

Unsafe, fixed и ref byte: как это будет выглядеть в C#
Здравствуйте! Есть функция ActiveX компонента GetCurrentImage(ref byte , int len), в варианте для C она выглядит так: LONG...

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 - invalid start byte
Добрый день При вызове скрипта вылетает такая ошибка: &quot;UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131:...

'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Работаю с библиотеками PIL и telebot В чем может быть проблема ? Ошибка - 'utf-8' codec can't decode byte 0xff in position 0:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru