System.Type

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

System.Type

Сообщение MIT » 04.07.2009 (Сб) 17:47

Объясните, пожалуйста, что из себя представляет сабж, как и что хранит в себе, какое представление своих данных имеет в памяти.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: System.Type

Сообщение Joo » 04.07.2009 (Сб) 18:04

MIT писал(а):Объясните, пожалуйста, что из себя представляет сабж, как и что хранит в себе, какое представление своих данных имеет в памяти.

MSDN говорит:
Код: Выделить всё
Класс Type является корневым классом для функциональных возможностей пространства имен System.Reflection и основным способом доступа к метаданным. С помощью членов класса Type можно получить сведения об объявленных в типе элементах: конструкторах, методах, полях, свойствах и событиях класса, а также о модуле и сборке, в которых развернут данный класс.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: System.Type

Сообщение MIT » 04.07.2009 (Сб) 19:42

Ну его предназначение, в общем, понятно. Меня интересует другое: например, как оно храниться в памяти?
Какой размер имеет структура
Код: Выделить всё
    Public Structure s11
        Dim t As System.Type
    End Structure
?


______________
Код
Код: Выделить всё
MsgBox(Marshal.SizeOf(New s11 With {.t = GetType(Mitirus.Graphics.GLayerEx)}))
Говорит "4"...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: System.Type

Сообщение Viper » 04.07.2009 (Сб) 21:22

MIT писал(а):Код
Код: Выделить всё
MsgBox(Marshal.SizeOf(New s11 With {.t = GetType(Mitirus.Graphics.GLayerEx)}))
Говорит "4"...
Это размер указателя. Реально размер этого класса будет другой.
Весь мир матрица, а мы в нем потоки байтов!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: System.Type

Сообщение MIT » 04.07.2009 (Сб) 21:24

Ну я уже понял что это указатель - значение меняется при каждом запуске.
Теперь надо из того класса вытащить чего-нибудь полезное. А лучше - записать туда свое... Или поменять указатель...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: System.Type

Сообщение Viper » 04.07.2009 (Сб) 21:25

MIT писал(а):Ну я уже понял что это указатель - значение меняется при каждом запуске.
Теперь надо из того класса вытащить чего-нибудь полезное. А лучше - записать туда свое... Или поменять указатель...
Зачем? :shock:
Весь мир матрица, а мы в нем потоки байтов!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: System.Type

Сообщение MIT » 04.07.2009 (Сб) 21:30

Да я все еще не могу успокоиться на счет идеи использования двумя массивами одного места в памяти. Просто маршалингом через IUnknown создать новый массив "поверх" старого не получается - в заголовке SZARRAY храниться тип первоначального массива, что не дает возможности создания чего-то другого. Из умных источников вычитал (правда не понял до конца), что этот тип там не обязателен. Вот и хочу поиграть с ним, вдруг получиться.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: System.Type

Сообщение Nord777 » 05.07.2009 (Вс) 17:21

MIT писал(а):Да я все еще не могу успокоиться на счет идеи использования двумя массивами одного места в памяти.
А где это действительно нужно?

И что-то мне кажется это не получится.
Я понимаю если бы ты сделал какой-нибудь менеджер "двойных" массивов, который бы подменял в заголовке тип массива(когда надо)...


MIT писал(а): Из умных источников вычитал (правда не понял до конца), что этот тип там не обязателен.
Что за источник? Ссылка есть?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: System.Type

Сообщение MIT » 05.07.2009 (Вс) 17:57

Nord777 писал(а):А где это действительно нужно?
И что-то мне кажется это не получится.
Я понимаю если бы ты сделал какой-нибудь менеджер "двойных" массивов, который бы подменял в заголовке тип массива(когда надо)...
Это действительно нужно, пусть и применение не очевидно. А до менеджера может как-нибудь дорасту, если с этим получиться, конечно.
Nord777 писал(а):Что за источник? Ссылка есть?
Угу, вот: http://www.codeproject.com/KB/dotnet/arrays.aspx . Смутило (и одновременно дало надежду) слово Optional в элементе таблицы SZARRAYS: ElementType(Type).
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: System.Type

Сообщение Nord777 » 05.07.2009 (Вс) 21:55

типа этого?
Код: Выделить всё
   Private Sub Test()
      Dim SB As New System.Text.StringBuilder()
      Dim Pointer As IntPtr
      Dim obj As Object
      Dim Arr() As Byte = New Byte() {&H88, 1, 2, 3, 4, 5, 6, &H99}

      obj = Arr
      SB.AppendLine("Element Type: " & obj.GetType.GetElementType.FullName)
      SB.AppendLine("Arr(0): " & CType(obj, Byte())(0).ToString("X2"))
      MsgBox(SB.ToString)
      SB.Length = 0

      Pointer = Marshal.UnsafeAddrOfPinnedArrayElement(Arr, 0%)
      Marshal.WriteInt32(Pointer, -8, &H79332A88)
      Marshal.WriteInt32(Pointer, -4, 2)
      obj = Arr
      SB.AppendLine("Element Type: " & obj.GetType.GetElementType.FullName)
      SB.AppendLine("Arr(0): " & CType(obj, Integer())(0).ToString("X8"))
      MsgBox(SB.ToString)
   End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: System.Type

Сообщение MIT » 05.07.2009 (Вс) 22:04

mov ecx,dword ptr [ebp-24h] писал(а):The runtime has encountered a fatal error. The address of the error was at 0x79e81f7a, on thread 0xd08. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

В общем-то оно, надо только в неуправляемую память засунуть. И хотелось бы иметь два аксессора, т.е. два "живых" массива. Впрочем если над этим написать менеджер, то задача решится.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: System.Type

Сообщение Viper » 05.07.2009 (Вс) 22:09

MIT писал(а):Да я все еще не могу успокоиться на счет идеи использования двумя массивами одного места в памяти.
В VB.NET проще для таких целей сделать класс, содержащий внутри указатель на блок неуправляемой памяти реализующий интерфейс массивов. В VB6 сие легко реализуется через прямое обращение к SAFEARRAY - даже два кирпича и статья GSerg'а есть на эту тему.
Весь мир матрица, а мы в нем потоки байтов!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: System.Type

Сообщение Nord777 » 05.07.2009 (Вс) 22:14

The runtime has encountered a fatal error.

&H79332A88
Только что проверил. Это число у меня работает в одной системе.
В другой системе крах.

Попробуй так:
Код: Выделить всё
      Dim SB As New System.Text.StringBuilder()
      Dim Pointer As IntPtr
      Dim obj As Object
      Dim Arr() As Byte = New Byte() {&H88, 1, 2, 3, 4, 5, 6, &H99}
      Dim ArrInt(0) As Integer

      Pointer = Marshal.UnsafeAddrOfPinnedArrayElement(ArrInt, 0%)
      Dim Num As Integer = Marshal.ReadInt32(Pointer, -8)

      obj = Arr
      SB.AppendLine("Element Type: " & obj.GetType.GetElementType.FullName)
      SB.AppendLine("Arr(0): " & CType(obj, Byte())(0).ToString("X2"))
      MsgBox(SB.ToString)
      SB.Length = 0

      Pointer = Marshal.UnsafeAddrOfPinnedArrayElement(Arr, 0%)
      Marshal.WriteInt32(Pointer, -8, Num)
      Marshal.WriteInt32(Pointer, -4, 2)
      'obj = Arr
      SB.AppendLine("Element Type: " & obj.GetType.GetElementType.FullName)
      SB.AppendLine("Arr(0): " & CType(obj, Integer())(0).ToString("X8"))
      MsgBox(SB.ToString)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

    TopList