2011-06-15 47 views
0

我想知道是否有可能在程序第一次啓動時調用事件或方法,顯然是第一次。這可能在C#中完成嗎?如果可以的話,可以有人展示一些如何實現的例子如何在首次啓動C#程序時運行方法或事件?

+7

你的意思是它運行在計算機上的第一次,但沒有後續執行? – Oded 2011-06-15 19:40:19

+0

@Oded是這就是 – Dennis 2011-06-15 19:48:22

+1

所以......基本上只有'一次性'運行?或者..它在計算機每次(重新)啓動後只能運行一次? – KriZ 2011-06-15 19:50:42

回答

2

你可以通過指定一些鎖定文件的DelayUntilReboot標誌使用MoveFileEx本地方法:

class Program 
{ 
    [Flags] 
    enum MoveFileFlags 
    { 
     None = 0, 
     ReplaceExisting = 1, 
     CopyAllowed = 2, 
     DelayUntilReboot = 4, 
     WriteThrough = 8, 
     CreateHardlink = 16, 
     FailIfNotTrackable = 32, 
    } 

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    static extern bool MoveFileEx(
     string lpExistingFileName, 
     string lpNewFileName, 
     MoveFileFlags dwFlags 
    ); 

    static void Main() 
    { 
     string lockFile = "foo.dat"; 
     if (!File.Exists(lockFile)) 
     { 
      // that's a first run after the reboot => create the file 
      File.WriteAllText(lockFile, ""); 

      // Mark the file for deletion after reboot 
      MoveFileEx(lockFile, null, MoveFileFlags.DelayUntilReboot); 

      Console.WriteLine("it's a first run"); 
     } 
     else 
     { 
      // that's a consecutive run 
      Console.WriteLine("it's a consecutive run"); 
     } 
    } 
} 
+0

嗨,這適用於控制檯應用程序,但我怎麼能在Windows窗體應用程序中使用它? – Dennis 2011-06-15 20:30:08

+0

@Dennis,在WinForms應用程序中,你仍然有一個Program.cs啓動器和一個'Main'方法,不是嗎?因此,在創建主窗體之前,只需將此代碼放在那裏。或者你也可以把它放在主窗體的構造函數中,但這會很浪費,因爲如果應用程序不能運行,你可能不需要等太多的東西來終止它。 – 2011-06-15 20:31:47

+0

啊,我明白了,好吧,我設法讓它在GUI應用程序(幾乎!)中工作,但我得到這個錯誤:名稱'MoveFileEx'在當前上下文中不存在。我缺少哪個命名空間? – Dennis 2011-06-15 20:34:44

3

當程序第一次運行時,您可以將文件寫入磁盤或將值寫入註冊表中。

你檢查你設置的任何東西 - 如果它不存在,你運行你的方法,如果它確實存在,你不會。

+0

林驚訝沒有在.NET中內置功能來做到這一點.. – Dennis 2011-06-15 20:03:39

+0

@丹尼斯 - 這不是所有程序都需要的東西,並且很容易實現。爲什麼把它放到框架中(它需要被寫入,測試,記錄等等,而收益相對較小)。 – Oded 2011-06-15 20:11:40

+0

但如果你重新啓動文件仍然會有沒有? – 2011-06-15 20:12:20

相關問題