Форум программистов, компьютерный форум, киберфорум
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. Показов 4869. Ответов 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
8725 / 3677 / 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
8725 / 3677 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru