访问c#中的内存地址

我正在连接一个ActiveX组件,它给我一个内存地址和字节数。

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

我强烈建议您使用IntPtr和Marshal.Copy。 这里有一些代码可以帮助您入门。 memAddr是您给出的内存地址,bufSize是大小。

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

这不要求您使用不安全的代码,该代码需要/ unsafe编译器选项,并且无法通过CLRvalidation。

如果需要除字节之外的其他数组,只需更改第二行。 Marshal.Copy有一堆重载。

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

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

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

 unsafe class Foo { } unsafe int FooMethod { } 

然后你可以使用指针*和&就像C.

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