当前位置: 首页 > 编程语言 > C#

Runaninstancefromtheapplicationshare

时间:2023-04-10 20:38:45 C#

runinstancefromtheapplication点击??.exe文件并运行应用程序,用户没有关闭正在运行的应用程序的第一个实例,下一个实例需要被运行,所以它应该出现在第一个实例而不是打开一个新实例。谁能帮我怎么做?提前致谢我经常通过检查同名的其他进程来解决这个问题。这样做的优点/缺点是您(或用户)可以通过重命名exe来“退出”检查。如果您不想这样做,您可以使用返回的Process对象。字符串procName=Process.GetCurrentProcess().ProcessName;if(Process.GetProcessesByName(procName).Length==1){...codehere...}这取决于您的需要,我认为无需重新编译即可绕过检查很方便(这是一个服务器进程,有时作为服务运行).VB.Net团队已经实施了一个解决方案。您将需要依赖于Microsoft.VisualBasic.dll,但如果您不介意,那么恕我直言,这是一个很好的解决方案。请参阅以下文章的结尾:单实例应用程序以下是文章的相关部分:1)添加对Microsoft.VisualBasic.dll的引用2)将以下类添加到您的项目中。公共类SingleInstanceApplication:WindowsFormsApplicationBase{privateSingleInstanceApplication(){base.IsSingleInstance=true;}publicstaticvoidRun(Formf,StartupNextInstanceEventHandlerstartupHandler){SingleInstanceApplicationapp=newSingleInstanceApplication();app.MainForm=f;app.StartupNextInstance+=startupHandler;app.Run(Environment.GetCommandLineArgs());}}打开Program.cs并添加以下using语句:usingMicrosoft.VisualBasic.ApplicationServices;将类级更改为以下内容:staticclassProgram{//////应用程序的主要入口点。///[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);SingleInstanceApplication.Run(newForm1(),StartupNextInstanceEventHandler);}publicstaticvoidStartupNextInstanceEventHandler(objectsender,StartupNextInstanceEventArgse){MessageBox.Show("Newinstance");}}编辑:修改问题后包含c#。我的答案是仅适用于vb.net应用程序选中MakeSingleInstanceApplication复选框以防止用户运行该应用程序的多个实例。清除此复选框的默认设置以允许应用程序的多个实例运行。您可以从Project->Properties->Application选项卡Resources执行此操作我们遇到了完全相同的问题。我们尝试了流程方法,但如果用户没有权限读取有关其他流程的信息(即不是管理员),它就会失败。所以我们实施了以下解决方案。基本上我们尝试打开一个文件进行独占阅读。如果失败(因为另一个实例已经这样做了),我们会得到一个异常并可以退出应用程序。布尔haveLock=假;尝试{lockStream=newSystem.IO.FileStream(pathToTempFile,System.IO.FileMode.Create,System.IO.FileAccess.ReadWrite,System.IO.FileShare.None);有锁=真;}catch(Exception){System.Console.WriteLine("获取锁失败。");}if(!haveLock){Inka.Controls.Dialoge.InkaInfoBoxdiag=newInka.Controls.Dialoge.InkaInfoBox("App已经启动");diag.Size=newSize(diag.Size.Width+40,diag.Size.Height+20);诊断.ShowDialog();应用程序.退出();}假装你正使用C#staticMutexmx;conststringsingleInstance=@"MU.Mutex";//////应用程序的主要入口点。///[STAThread]staticvoidMain(){try{System.Threading.Mutex.OpenExisting(singleInstance);MessageBox.Show("已经存在实例");返回;}catch(WaitHandleCannotBeOpenedException){mx=newSystem.Threading.Mutex(true,singleInstance);}Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);应用程序运行(新主窗体());我会在这种情况下使用Mutex,或者Semaphore也可以工作(但Mutex似乎更合适)。这是我的示例(来自WPF应用程序,但相同的原则应该适用于其他项目类型):publicpartialclassApp:Application{conststringAppId="MYAPPIDFORTHEMUTEX";staticMutexmutex=newMutex(false,AppId);staticboolmutexAccessed=false;protectedoverridevoidOnStartup(StartupEventArgse){try{if(mutex.WaitOne(0))mutexAccessed=true;}catch(AbandonedMutexException){//处理被遗弃的互斥体的罕见情况//在我的应用程序中这不是问题,我可以继续mutexAccessed=true;}if(mutexAccessed)base.OnStartup(e);否则关机();}protectedoverridevoidOnExit(ExitEventArgse){if(mutexAccessed)mutex?.ReleaseMutex();互斥锁?.Dispose();互斥=空;base.OnExit(e);}}我找到了这段代码并且它起作用了!以上就是C#学习教程:从应用程序运行一个例子所有内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——//////应用程序的主要入口点。///限制一个应用程序。到一个实例///[STAThread]staticvoidMain(){//Mutex以确保您的应用程序尚未running.Mutexmutex=newSystem.Threading.Mutex(false,"MyUniqueMutexName");try{if(mutex.WaitOne(0,false)){//运行应用程序Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);应用程序运行(新Form1());}else{MessageBox.Show("应用程序的一个实例已经在运行。","应用程序正在运行",MessageBoxButtons.OK,MessageBoxIcon.Information);}}catch(Exceptionex){MessageBox.Show(ex.Message,"ApplicationError'MyUniqueMutexName'",MessageBoxButtons.OK,MessageBoxIcon.Information);}finally{if(mutex!=null){mutex.Close();互斥=空;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: