C# 当从非托管进程读取内存时,类似inotifyproperty的内容发生了更改

C# 当从非托管进程读取内存时,类似inotifyproperty的内容发生了更改,c#,winapi,C#,Winapi,我正在从其他正在运行的进程中读取内存,而我使用的源代码是不存在的 [DllImport("kernel32.dll")] public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, uint size, out IntPtr lpNumberOfBytesRead); 一切正常。我得到了所需的值,但现在我想在我的程序中实现类似INotifyP

我正在从其他正在运行的进程中读取内存,而我使用的源代码是不存在的

[DllImport("kernel32.dll")]
public static extern int ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, uint size, out IntPtr lpNumberOfBytesRead);
一切正常。我得到了所需的值,但现在我想在我的程序中实现类似INotifyPropertyChanged的东西,所以当非托管进程中的值更改时,我的代码会注册它并更新变量X

到目前为止我有

private string x;
public string X { get { return x; } }
....
Threading.Timer timerX = new Timer(x => UpdateX(), null, 0, 500)
....
private void UpdateX()
{
    //Read value from unmanaged process
    OnPropertyChanged("X");
}

它通过每500毫秒读取一次非托管进程内存来更新X,但这感觉像是黑客攻击。而且,非托管进程中的内存可以在500毫秒内更改几次,也可以在几分钟内更改一次,所以缩短间隔似乎有些过分。还有更优雅的解决方案吗。谢谢。

不,当另一个进程中的内存发生更改时,无法获取通知。如果您是一个调试器,那么可以使用CPU数据断点在一小部分位置听到更改。但这将对性能产生重大影响,并且只有在实际调试时才是正确的方法

如果另一个进程是您自己的,那么最好的方法是反汇编和理解其他进程的代码,并添加您自己的代码以发送通知。在没有资源的情况下工作,做出一个小小的改变,可能没有你想象的那么困难


Martyn

您的问题是关于如何实现INotifyPropertyChanged的吗?看来你是这条路的一部分。。。请看这里:我知道在使用托管代码时如何实现INPC,但当其他进程中的值发生变化时,我想在我的进程中更新值。老实说,我并不真正理解这种否决。我认为这是个好问题。问题不在于实现INotifyPropertyChanged(写下这句话可能是个错误),而在于如何以更少的资源消耗方式实现他想要的通知机制+1. @user488819:恐怕你没有其他的解决方案,在你的情况下,那是你自己提出的。@Tigran谢谢你的支持。是的,如果我不使用INPC这个词可能会更好,但我还是用了“类似INPC的东西”。@user:在这种情况下,除了像你已经在做的那样“轮询”之外,你似乎没有其他选择。问题是我没有其他流程的代码,但谢谢你的回复。