我正在与ActiveX组件接口,该组件为我提供了内存地址和字节数。
如何编写一个C#程序来访问从给定内存地址开始的字节?有没有办法本机化,或者我将不得不与C ++接口? ActiveX组件和我的程序共享相同的内存/地址空间吗?
答案 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组件。