一个Exe,
防止多重启动Debug下的exe可以检测多重启动
Release下的Exe没有效果,
代码如下 bool createdNew;
            Mutex mutex = new Mutex(true, Application.ProductName, out createdNew);
            if (!createdNew)
            {
                Process instance = RunningInstance();
                if (instance != null)
                {
                    Win32NoSafeMethods.HandleRunningInstance(instance);
 
                }
               return;
            }

解决方案 »

  1.   

    应该不是debug和release的问题,看看程序有没有别的地方有问题吧,把vshost选项关掉看看
      

  2.   

    仍然,怪就怪在Debug生成的Exe一切正常
    疑惑
      

  3.   

    我觉得可能是由于编译方式不同引起的生成进程名(Application.ProductName)不同造成的,仔细检查一下设置
      

  4.   

    release也是可以调试的,你可以跟踪进去看看
      

  5.   

    我用Log写出来了,生成进程名相同
      

  6.   


    bool createdNew;
    Mutex mutex = new Mutex(true, Application.ProductName, out createdNew);
    if (!createdNew)
    {
        ...
        return;
    }
    Application.Run( ... );
    mutex.Close();                 //<--加这一句
    原因:Mutex被垃圾回收后就被释放了。
      

  7.   

    应该不是这个问题吧,还没出作用域呢,GC不会回收mutex的
      

  8.   

    多谢gomoku,重读了Jeffrey写的GC那一章,专门有一个例子讨论了这个问题,呵呵
      

  9.   


    bool createdNew;
                Mutex mutex = new Mutex(true, Application.ProductName, out createdNew);
                if (!createdNew)//在Release编译下的exe,createdNew的值是true,在Debug下是false
                {
                    Process instance = RunningInstance();
                    if (instance != null)
                    {
                        Win32NoSafeMethods.HandleRunningInstance(instance);
     
                    }
                   return;
                }
      

  10.   

    为了支持断点调试,Debug版人为延长了变量的生命周期。
    比如断点设在最后一行,这时候检查mutex的值。如果mutex被回收了,调试器显示它的内容就会出错。Release版则不不一样,所以你的问题只出现在Release版下。
      

  11.   

    createdNew的结果不同,
    碰到这种情况,该如何处理?
    谢谢
      

  12.   


    mutex.Close(); 加不加这一句,对于createdNew的结果有影响吗?
    好像没有