С# -> VB.Net с указателями на функции в неуправляемой памяти

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

С# -> VB.Net с указателями на функции в неуправляемой памяти

Сообщение DODge » 24.04.2016 (Вс) 19:12

Здравствуйте!
Пытаюсь перевести код из С# в VB.Net. Проблема в том, что в оригинальном коде C# используются указатели на функции в неуправляемой памяти. Для наглядности приведу код:

public unsafe int get_NumberFaces()
{
return **(((int*) this._nativePointer))[16](this._nativePointer);
}

где _nativePointer объявлен как:
protected internal unsafe void* _nativePointer;

При попытке перевести код в VB.Net с помощью Reflector'а получается следующее:

Public Function get_NumberFaces() As Integer
Return *DirectCast(Me._nativePointer, Integer*)(16)(Me._nativePointer)
End Function

Естественно, данный код в VB.Net не работает, т.к. среда в месте где (16) пытается найти свойство по умолчанию для _nativePointer. Судя по IL коду данной функции берется адрес поля _nativePointer и к нему добавляется эти (16) байт и оттуда вызывается:
calli method unmanaged stdcall int32 *(void*)

Но как это реализовать в VB.Net не представляю, или может я вообще всё не так понимаю? Подскажите кто разбирается, или дайте ссылку где об этом можно почитать.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.04.2016 (Пн) 17:10

Не 16 байт, а 16 размеров int'а, т. е. 16*4=64 байта.
А разве VB.NET поддерживает указатели в таком виде DirectCast(Me._nativePointer, Integer*)?

Marshal

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re:

Сообщение DODge » 27.04.2016 (Ср) 2:59

Qwertiy писал(а):А разве VB.NET поддерживает указатели в таком виде DirectCast(Me._nativePointer, Integer*)?

В том то и дело что нет. Просто для начала хочу разобраться в С# версии кода что происходит и потом попытаться сделать это обходными путями в VB.Net.

Qwertiy писал(а):Marshal

Про маршалинг я в курсе, именно этими статическими функциями я и пользуюсь для работы с неуправляемой памятью (в том числе и смещение по указателю).
В VB я использую System.IntPtr вместо сишарповского void. Кое что уже получилось перевести и прекрасно работает.
Проблема возникла как раз с этим выражением в 1м посте.

Qwertiy писал(а):Не 16 байт, а 16 размеров int'а, т. е. 16*4=64 байта.

Это я понял, у меня тут сразу размер 4х интов = 16 байт (32-разрядная версия билда программы).
Если я правильно понимаю то VB вариант будет выглядеть так:

Dim newPtr as IntPtr = My._nativePointer + 16

Но я до сих пор не могу понять что делает эта строчка?

calli method unmanaged stdcall int32 *(void*)
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.04.2016 (Ср) 23:23

DODge писал(а):Это я понял, у меня тут сразу размер 4х интов = 16 байт (32-разрядная версия билда программы).

Это утверждение не соответствует коду.

DODge писал(а):calli method unmanaged stdcall int32 *(void*)

Вызов? Зачем вообще разбирать il-код, когда есть код на шарпе?

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Re:

Сообщение DODge » 30.04.2016 (Сб) 2:40

Qwertiy писал(а):Это утверждение не соответствует коду.

Т.е. я всё-таки делаю смещение неправильно?

Qwertiy писал(а):Зачем вообще разбирать il-код, когда есть код на шарпе?

Потому что я не могу понять что делает единственная строчка на шарпе.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12


Вернуться в C#

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

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

    TopList