2

我有这个代码:

private void timer1_Tick(object sender, EventArgs e)
    {
        #region BaseAddress

      Process[] test = Process.GetProcessesByName(process); //Get process handle
      if (test.Any())
      {

          int Base = test[0].MainModule.BaseAddress.ToInt32();
      }
        #endregion
       //lots of other code blocks
     }

我现在想从 timer1_Tick 控件中取出“BaseAddress”区域,以提高代码效率并让它在程序开始时运行一次。此控件中的其他代码经常使用变量“Base”,例如,无需返回使用 Base 的所有实例并执行诸如 MyGlobals.Base 之类的操作,使其全局可访问的最佳方法是什么?

4

2 回答 2

2

将地址延迟加载到静态变量中。在您第一次使用它之前,它不会初始化,然后将在应用程序的整个生命周期内保留在内存中。

public static MyGlobals
{
    private static readonly Lazy<int> _processBase = new Lazy<int>(() => GetProcessBase("MyProcessName"));

    // I don't recommend using the word Base, but OK...
    public static int Base { get { return _processBase.Value; } }

    private static int GetProcessBase(string processName)
    {
        int b = 0;
        Process[] p = Process.GetProcessesByName(processName);
        if(p != null && p.Length > 0)
        {
            b = p[0].MainModule.BaseAddress.ToInt32();
        }
        return b;
    }
}

在应用程序的其他部分...

private void timer1_Tick(object sender, EventArgs e) 
{ 
    if(MyGlobals.Base > 0)
    {
         // TODO: change "Base" to "MyGlobals.Base" in code below or it won't compile...
         //lots of other code blocks 
    }
} 
于 2012-06-17T17:28:22.537 回答
0

在这种情况下,我将使用的方法是创建一个带有Base属性的单例类ProcessFetcher(例如) 。

我的班级将有一个fetch()函数和isDataPresent属性。

您可以决定手动调用 fetch 或将其放在构造函数中。

于 2012-06-17T17:18:55.057 回答