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'を削除して、コードをより効率的にし、プログラムの開始時に1回実行するようにします。このコントロールの他のコードは、変数「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 に答える