Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248

Заданное приведение является недопустимым

20.01.2019, 15:53. Показов 2622. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу класс для чтения памяти
Не хочу писать для каждого типа свой метод, поэтому решил сделать так:

C#
1
2
3
4
5
6
7
8
        public cData Read<cData>(UInt32 dwAddress)
        {
            int size = getSize<cData>();
 
            byte[] BytesToRead = new byte[size];
            ReadProcessMemory(hProcess, (IntPtr)dwAddress, BytesToRead, size, out int Outp);
            return (cData)(object)BytesToRead;           
        }
Но проблема в том, что, видимо, он не может привести
Пишем: "Заданное приведение является недопустимым."
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2019, 15:53
Ответы с готовыми решениями:

Заданное приведение является недопустимым
Всем привет. есть функция public T GetObject&lt;T&gt;(string key1, string key2) { T result = default(T); ...

Заданное приведение является недопустимым
Добрый вечер возникла такая проблема &quot;Заданное приведение является недопустимым&quot; в этом месте return (long)spentTime; spentTime...

System.InvalidCastException: "Заданное приведение является недопустимым."
var data = _service.GetCountNumber(id); var countNumber = (int)data.Rows; // System.InvalidCastException: &quot;Заданное приведение является...

11
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
20.01.2019, 16:23
C#
1
2
3
4
5
6
7
8
        public T Read<T>(UInt32 dwAddress) where T : unmanaged
        {
            int size = Unsafe.SizeOf<T>()
            byte[] BytesToRead = new byte[size];
            if (!ReadProcessMemory(hProcess, (IntPtr)dwAddress, BytesToRead, size, out int Outp))
                 throw new Win32Exception(Marshal.GetLastWin32Error());
            return Unsafe.ReadUnaligned<T>(ref BytesToRead[0]);  
        }
1
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
20.01.2019, 19:43  [ТС]
Не находит класс Unsafe :c

Добавлено через 1 минуту
даже при подключении System.Runtime.CompilerServices

Добавлено через 3 минуты
Целевая платформа 4.5.2
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
20.01.2019, 19:45
Цитата Сообщение от FastMailSend Посмотреть сообщение
даже при подключении System.Runtime.CompilerServices
Значит неправильно подключаете.

https://www.nuget.org/packages... es.Unsafe/
1
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
20.01.2019, 20:56  [ТС]
А есть ли способ без unsafe методов?

Добавлено через 23 секунды
плюсом не очень хочется скачивать отдельную dllку
0
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
22.01.2019, 15:45  [ТС]
Есть что?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
22.01.2019, 16:21
Лучший ответ Сообщение было отмечено FastMailSend как решение

Решение

Можно через Marshal.PtrToStructure, но это слишком медленно работает, где-то в 85 раз медленнее чем через Unsafe.ReadUnaligned.
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public unsafe T Read<T>(UInt32 dwAddress) where T : struct
        {
            int size = Marshal.SizeOf<T>();
            byte[] BytesToRead = new byte[size];
            if (!ReadProcessMemory(hProcess, (IntPtr)dwAddress, BytesToRead, size, out int Outp))
                throw new Win32Exception(Marshal.GetLastWin32Error());
 
            fixed (byte* p = BytesToRead)
            {
                return Marshal.PtrToStructure<T>(new IntPtr(p));
            }
        }
1
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
22.01.2019, 18:19  [ТС]
Попробуем, спасибо

Добавлено через 42 секунды
Можно вообще сделать через ifы, по названию, но это кажется мне извращение.но все же решением :/
0
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
23.01.2019, 15:50  [ТС]
C#
1
2
3
4
5
6
7
8
9
        unsafe cData cast<cData>(byte[] bytes) where cData : struct
        {
 
            fixed (byte* p = bytes)
                if (p != null)
                    return Marshal.PtrToStructure<cData>(new IntPtr(p));
                else
                    return default(cData);
        }
бьюсь уже час, а ошибку не могу исправить:
CS0453 Для использования в качестве параметра "cData" в универсальном типе или методе "cast<cData>(byte[])" тип "cData" должен быть типом значения, не допускающим значения Null.

Добавлено через 34 секунды
уже и cData? разрешал ему возвращать, все ругается
использую так: cast<cData>(BytesToRead);
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
23.01.2019, 16:26
Какой тип вы передаете в метод?
1
3 / 2 / 2
Регистрация: 24.05.2016
Сообщений: 248
23.01.2019, 17:29  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public cData Read<cData>(UInt32 dwAddress)
        {
            int size = getSize<cData>();
 
            byte[] BytesToRead = new byte[size];
            ReadProcessMemory(hProcess, (IntPtr)dwAddress, BytesToRead, size, out int Outp); //Win API - Reads Data At Specified Location        
 
            return cast<cData>(BytesToRead);
        }
 
 
        unsafe cData cast<cData>(byte[] bytes) where cData : struct
        {
 
            fixed (byte* p = bytes)
                if (p != null)
                    return Marshal.PtrToStructure<cData>(new IntPtr(p));
                else
                    return default(cData);
        }
Добавлено через 20 секунд
я даже не запускаю программу
в самом компиляторе выдает
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
23.01.2019, 18:26
C#
1
public cData Read<cData>(UInt32 dwAddress) where cData : struct
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2019, 18:26
Помогаю со студенческими работами здесь

Ошибка "Заданное приведение является недопустимым"
Помогите пожалуйста Выдает ошибку на этой строке var resolvedDate = new DateTime(1970, 1, 1).AddMilliseconds((int)date + threeHours); ...

Приведение String к Double, если в строке разделителем дробной части является точка
Уже сутки сижу программирую - С# нов для меня, но при отладке возникла проблема и то ли я не соображаю, то ли лыжи не едут. Для примера,...

Определить, является ли заданное число простым
Написать рекурсивную функцию определения, является ли заданное натуральное число простым.

Ошибка в потоке "Заданное приведение является недопустимым"
Здравствуйте! Написал программу, которая использует многопоточность. Так как с одним потоком программа жутко зависает. Но возникает ошибка...

Заданное приведение является недопустимым
Visual studio пишет что данное приведение является недопустимым в чем ошибка? int Number_order = datareader_main.GetInt32(1); ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru