Debug和Release生成的Dll

Crystalzhou 2009-11-25 01:18:53
一个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;
}
...全文
284 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
airnetbean 2010-02-06
  • 打赏
  • 举报
回复
顶6楼
卧_槽 2009-11-25
  • 打赏
  • 举报
回复
是一个好问题
Crystalzhou 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gomoku 的回复:]
6楼。
[/Quote]

mutex.Close(); 加不加这一句,对于createdNew的结果有影响吗?
好像没有
gomoku 2009-11-25
  • 打赏
  • 举报
回复
6楼。
Crystalzhou 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gomoku 的回复:]
为了支持断点调试,Debug版人为延长了变量的生命周期。
比如断点设在最后一行,这时候检查mutex的值。如果mutex被回收了,调试器显示它的内容就会出错。

Release版则不不一样,所以你的问题只出现在Release版下。

[/Quote]
createdNew的结果不同,
碰到这种情况,该如何处理?
谢谢
gomoku 2009-11-25
  • 打赏
  • 举报
回复
为了支持断点调试,Debug版人为延长了变量的生命周期。
比如断点设在最后一行,这时候检查mutex的值。如果mutex被回收了,调试器显示它的内容就会出错。

Release版则不不一样,所以你的问题只出现在Release版下。
Crystalzhou 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gomoku 的回复:]
作用域是编译期现象(比如c++编译器在作用域停止的地方插入析购函数)。

C#没有这种行为,垃圾回收的根也不是这样算的。
[/Quote]

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;
}
goldenbull9 2009-11-25
  • 打赏
  • 举报
回复
多谢gomoku,重读了Jeffrey写的GC那一章,专门有一个例子讨论了这个问题,呵呵
gomoku 2009-11-25
  • 打赏
  • 举报
回复
作用域是编译期现象(比如c++编译器在作用域停止的地方插入析购函数)。

C#没有这种行为,垃圾回收的根也不是这样算的。
goldenbull9 2009-11-25
  • 打赏
  • 举报
回复
应该不是这个问题吧,还没出作用域呢,GC不会回收mutex的
gomoku 2009-11-25
  • 打赏
  • 举报
回复

bool createdNew;
Mutex mutex = new Mutex(true, Application.ProductName, out createdNew);
if (!createdNew)
{
...
return;
}
Application.Run( ... );
mutex.Close(); //<--加这一句


原因:Mutex被垃圾回收后就被释放了。
Crystalzhou 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuanhuiqiao 的回复:]
我觉得可能是由于编译方式不同引起的生成进程名(Application.ProductName)不同造成的,仔细检查一下设置
[/Quote]
我用Log写出来了,生成进程名相同
goldenbull9 2009-11-25
  • 打赏
  • 举报
回复
release也是可以调试的,你可以跟踪进去看看
yuanhuiqiao 2009-11-25
  • 打赏
  • 举报
回复
我觉得可能是由于编译方式不同引起的生成进程名(Application.ProductName)不同造成的,仔细检查一下设置
Crystalzhou 2009-11-25
  • 打赏
  • 举报
回复
仍然,怪就怪在Debug生成的Exe一切正常
疑惑
goldenbull9 2009-11-25
  • 打赏
  • 举报
回复
应该不是debug和release的问题,看看程序有没有别的地方有问题吧,把vshost选项关掉看看

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧