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

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

30.12.2010, 11:35. Просмотров 2003. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2010, 11:35
Ответы с готовыми решениями:

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

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

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

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

wav byte[] в flac byte[]
Ситуация такая: С микрофона каждую 0.1 сек идет byte где то по 3к значений....

4
NickoTin
Почетный модератор
Эксперт .NET
8448 / 3570 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 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
real_vadim
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
30.12.2010, 16:50  [ТС] 3
Дело в том что интерфейс фиксированный, и поменять тип аргумента не могу
0
NickoTin
Почетный модератор
Эксперт .NET
8448 / 3570 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 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
real_vadim
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
30.12.2010, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2010, 17:40

Преобразование данных в byte[]
Здравствуйте! Часто сталкивался с проблемой при записи данных в файл или...

"Вшить" в файл имя файла. Или как из string перевести в byte[]
Здравствуйте. Считываю файл, получаю массив байтов. Сохраняю его имя,...

Запуск неуправляемого кода внутри кода c#
часто требуется при выполнении программы запускать исполняемые файлы (exe) с...


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

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

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