2011-06-15 81 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

相关问题