C#内存结构指针

时间:2013-09-07 15:04:56

标签: c#

我正在处理内存读取器/写入器类,但我坚持使用它。 我的问题是我想用结构指针修改其他进程内存值。 我知道如何在C ++中完成它而不是用C#

我目前的代码是:

class CModifier
{
    struct Data
    {
        int iMember;
        float fMember;
    }

    public CModifier()
    {
        Data data[62];
        *data = 0x123456;

        // use them to modify values etc.
        data.fMember = 1.2345f;
    }
}

2 个答案:

答案 0 :(得分:2)

C#允许有限访问内存位置,但实际上并不推荐,只有在您知道其他系统(如垃圾回收)如何处理内存后才应尝试。引用运算符&和去引用运算符*用于访问内存。您还必须在方法声明中使用unsafe关键字。举个例子:

public unsafe void Method()
{
    int x = 10;
    int y = 20;
    int *ptr1 = &x;
    int *ptr2 = &y;
    Console.WriteLine((int)ptr1);
    Console.WriteLine((int)ptr2);
    Console.WriteLine(*ptr1);
    Console.WriteLine(*ptr2);
}

请注意,还有其他更高级的事情需要考虑,例如固定内存位置以阻止垃圾收集器在内存中移动对象,以及此过程对堆栈堆的影响。

底线,使用指针引用需要您自担风险,并且仅作为最后的手段。

答案 1 :(得分:-2)

我觉得C ++专业人士会因为没有使用正确的技术术语而抨击我的帖子,但是很好。

C#有一个'unsafe'修饰符,可以用来设置指针调整代码,但是在另一个位置修改结构的更好选项是'ref'关键字。

我不能说 - 确切地说 - 你想要完成的事情可以在C#中完成(哎呀,我不确定我是否会在C ++中理解它),但这就是我如何做到的,如同你已经描述过了。

void ChangeMyStruct(ref Data etc) {
  data.fMember = 1.2345f;
}

void mainMethod() {
  ChangeMyStruct(ref dataOne);
}