如何在.NET Framework 精简版中防止应用程序运行两次?

dyb1234567 2004-09-11 11:29:15
Vb6 中

If App.PrevInstance = True Then End

' Visual Basic .NET
Function PrevInstance() As Boolean
If Ubound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
Return True
Else
Return False
End If
End Function


但是在 .NET Framework 精简版中 呢?

那位高手指点下迷津?谢谢!
...全文
260 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanty 2004-09-23
  • 打赏
  • 举报
回复
using System.Threading;

static void Main()
{
bool bRun=true;
Mutex m=new Mutex(true,Application.ProductName,out bRun);
if(bRun)
{
Application.Run(new Form1());
m.ReleaseMutex();
}
else
{
MessageBox.Show("程序已经运行");
}
}
这个最佳
myclife 2004-09-18
  • 打赏
  • 举报
回复
using System.Threading;

static void Main()
{
bool bRun=true;
Mutex m=new Mutex(true,Application.ProductName,out bRun);
if(bRun)
{
Application.Run(new Form1());
m.ReleaseMutex();
}
else
{
MessageBox.Show("程序已经运行");
}
}
用互斥信号量的方法比较好,不管什么语言程序集都是一样的,在vb.net中跟这个基本一致。
声明一个 System.Threading.Mutex类的实例处理就可以了.
indistinct_sword 2004-09-18
  • 打赏
  • 举报
回复
up
zushenf 2004-09-17
  • 打赏
  • 举报
回复
[DllImport("CoreDll.dll")]
zushenf 2004-09-17
  • 打赏
  • 举报
回复
[DllImport("CoreDll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


//以下放在main函数里面的最上面
Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
IntPtr hWnd = FindWindow(null,
asm.GetModules()[0].FullyQualifiedName);

if (hWnd != IntPtr.Zero)
Application.Exit;
zushenf 2004-09-17
  • 打赏
  • 举报
回复
只能用用findwindow的方法
yuhonglai 2004-09-17
  • 打赏
  • 举报
回复
关注
如果没有可行的方法,用配置文件写一个标识变量,程序开始运行时修改一次,
程序退出时修改会原来的值,是一个方法
但是要包装你的程序不可能异常中止
比如不能通过内存查看器中止你的程序
ghui 2004-09-14
  • 打赏
  • 举报
回复
我以前也曾将问过,但回答的都紧紧适用于Windows程序,而不是精简版的.net.
适用一种老方法,参看
http://community.csdn.net/Expert/topic/3134/3134918.xml?temp=.341427

它能够保证同一个路径下的同一个程序仅仅能够运行一次。

dyb1234567 2004-09-14
  • 打赏
  • 举报
回复
哎呀,都不行啊

1 查找窗口的API,我没有调试成功
2 BearRui(我有点笨,但我很特别,所以我特别笨!) 的方法无法在VB .net 中找到相对应的函数和方法。

哎!在VB 6 中一句代码就搞定的事情在.NET Framework 精简版中咋就这么难呢?
拉达曼迪斯II 2004-09-14
  • 打赏
  • 举报
回复
1:通过XML配置
实现
2:看看。NET CF中有没有可用的PROCESS相关的类。
3:用传统的API中的查窗口名,不过用的时候要小心。
个人看法。。。
Firestone2003 2004-09-12
  • 打赏
  • 举报
回复
主要是精简版里支持不支持相关的方法
Dugu_Niu 2004-09-12
  • 打赏
  • 举报
回复
这个是c sharp代码
你查查msdn看看这个类和方法精简版中有没有,如果有就可以
mingchao123 2004-09-12
  • 打赏
  • 举报
回复
这个我过去用过,代码不在身边。大意是假如你的程序的主窗体名是“myApplication”,用 api 函数先查找一个窗体名比如“myApplication0” ,如果存在就表示已经有一个副本在运行,退出。如果没找到,则将自己的窗体名改为“myApplication0”,正常运行下去。只是在.net中这个api函数的使用还有点讲究。
BearRui 2004-09-12
  • 打赏
  • 举报
回复
using System.Threading;

static void Main()
{
bool bRun=true;
Mutex m=new Mutex(true,Application.ProductName,out bRun);
if(bRun)
{
Application.Run(new Form1());
m.ReleaseMutex();
}
else
{
MessageBox.Show("程序已经运行");
}
}
dyb1234567 2004-09-11
  • 打赏
  • 举报
回复
哎呀,谢谢你,可是不能用啊,我用VB.net 开发 Pocket 2003 的应用
Dugu_Niu 2004-09-11
  • 打赏
  • 举报
回复
namespace System.Diagnostics;
static void Main()
{
Process instance = RunningInstance();
if (instance == null)
{
Appliction.Run(new MainFrm());
}
else
MessageBox.Show("程序已经运行!");
}

17,747

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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