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

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

30.12.2010, 11:35. Показов 2728. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2010, 11:35
Ответы с готовыми решениями:

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

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

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

Преобразовать String в Byte[] без использования Encoding
Всем доброго времени суток :) В общем возникла "проблема" имеем код - byte Send = new byte {...

4
Почетный модератор
Эксперт .NET
8700 / 3652 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.12.2010, 16:47 2
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  [ТС] 3
Дело в том что интерфейс фиксированный, и поменять тип аргумента не могу
0
Почетный модератор
Эксперт .NET
8700 / 3652 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.12.2010, 17:14 4
Попробуй так:
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  [ТС] 5
Идея конечно не плохая, но в результате получается мусор :-(
вернее первый элемент совпадает, а дальше непонятные числа
использовал вот этот код:
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2010, 17:40

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

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

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

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

Перевести строку, содержащую данные массива байт (byte[]) в byte[]
Приветствую. Есть такая строка - &quot;&quot; Как её перевести в массив байт? 1. Допустим, что...

Invalid byte 1 of 1-byte UTF-8 sequence - ошибка (Intellij idea)
Есть небольшой проект, точнее, только зачаток, запускается нормально, но при сборке в jar ругается,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.