-3

我正在研究一个内存读取器/写入器类,但我坚持下去。我的问题是我想用结构指针修改其他进程内存值。我知道如何用 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;
    }
}
4

2 回答 2

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);
}

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

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

于 2013-09-07T15:19:31.887 回答
-2

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

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

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

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

void mainMethod() {
  ChangeMyStruct(ref dataOne);
}
于 2013-09-07T15:22:08.437 回答