Доступ к адресу памяти в c # - PullRequest
5 голосов
/ 10 июня 2009

Я взаимодействую с компонентом ActiveX, который дает мне адрес памяти и количество байтов.

Как я могу написать программу на C #, которая будет обращаться к байтам, начиная с заданного адреса памяти? Есть ли способ сделать это изначально, или мне придется взаимодействовать с C ++? Разделяют ли компонент ActiveX и моя программа одно и то же пространство памяти / адреса?

Ответы [ 4 ]

10 голосов
/ 10 июня 2009

Вы можете использовать Marshal.Copy , чтобы скопировать данные из собственной памяти в управляемый массив. Таким образом, вы можете использовать данные в управляемом коде без использования кода unsafe .

7 голосов
/ 10 июня 2009

Я настоятельно рекомендую вам использовать IntPtr и Marshal.Copy. Вот код, который поможет вам начать. memAddr - это адрес вашей памяти, а bufSize - это размер.

IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[bufSize];
Marshal.Copy(bufPtr, data, 0, bufSize);

Для этого не требуется использовать небезопасный код, для которого требуется параметр компилятора / unsafe и который не проверяется CLR.

Если вам нужен массив чего-то кроме байтов, просто измените вторую строку. Marshal.Copy имеет кучу перегрузок.

2 голосов
/ 10 июня 2009

Я думаю, вы ищете тип IntPtr. Этот тип (при использовании в блоке unsafe) позволит вам использовать дескриптор памяти из компонента ActiveX.

1 голос
/ 10 июня 2009

C # может использовать указатели. Просто используйте ключевое слово «unsafe» перед вашей переменной класса, блока, метода или члена (не локальными переменными). Если класс помечен как небезопасный, все переменные-члены также небезопасны.

unsafe class Foo
{

}

unsafe int FooMethod
{

}

Тогда вы можете использовать указатели с * и & как с C.

Я не знаю о компонентах ActiveX в одном и том же адресном пространстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...