访问c#中的内存地址

时间:2009-06-09 20:15:56

标签: c# memory-management activex

我正在与ActiveX组件接口,该组件为我提供了内存地址和字节数。

如何编写一个C#程序来访问从给定内存地址开始的字节?有没有办法本机化,或者我将不得不与C ++接口? ActiveX组件和我的程序共享相同的内存/地址空间吗?

4 个答案:

答案 0 :(得分:10)

您可以使用Marshal.Copy将数据从本机内存复制到托管数组中。这样,您就可以在托管代码中使用数据,而无需使用unsafe代码。

答案 1 :(得分:7)

我强烈建议您使用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 :(得分:2)

我认为您正在寻找IntPtr类型。此类型(在unsafe块中使用时)将允许您使用ActiveX组件中的内存句柄。

答案 3 :(得分:1)

C#可以使用指针。只需在类,块,方法或成员变量(不是局部变量)前面使用'unsafe'关键字。如果一个类被标记为不安全,那么所有成员变量也是不安全的。

unsafe class Foo
{

}

unsafe int FooMethod
{

}

然后你可以使用带*和&的指针就像C。

我不知道同一地址空间中的ActiveX组件。