/// <summary> /// Opens an existing named mutex. /// </summary> /// <param name="name">The name of a system-wide named mutex object.</param> /// <returns>A <see cref="NamedMutex"/> object that represents a named system mutex.</returns> /// <remarks>The OpenExisting method attempts to open an existing named mutex. /// If the system mutex does not exist, this method throws an exception instead of creating the system object. /// Two calls to this method with the same value for name do not necessarily return the same <see cref="NamedMutex"/> object, even though they represent the same named system mutex.</remarks> /// <exception cref="ArgumentException">name is a zero-length string. /// -or- /// name is longer than 260 characters.</exception> /// <exception cref="ArgumentNullException">name is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="WaitHandleCannotBeOpenedException">The named mutex does not exist.</exception> public static NamedMutex OpenExisting(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (name.Length < 1) { throw new ArgumentException("name is a zero-length string."); } if (name.Length > 260) { throw new ArgumentException("name is longer than 260 characters."); } bool created; NamedMutex m = new NamedMutex(false, name, out created); if (created) { //mutex doesnt already exist m.Dispose(true); throw new WaitHandleCannotBeOpenedException(); } return(m); }
static void Main() { Boolean firstInstance; using (NamedMutex mx = new NamedMutex(false, "2D2EBFAC-543A-4FE8-A4E6-D88F5A76B2A1", out firstInstance)) { if (firstInstance) { try { ScannerProxy.ScannerAPI.SetLabelSuffix(); Boolean start = true; try { Assembly.Load("System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=3BE235DF1C8D2AD3"); } catch { start = false; MyClass.ShowError("Не установлен Sql Server Compact 3.5"); } if (start) { Application.Run(new FormMain()); } GC.KeepAlive(mx); } finally { ScannerProxy.ScannerAPI.RestoreLabelSuffix(); } } } }
static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += FMSC.Utility.ErrorHandling.ErrorHandlers.UnhandledException; using (NamedMutex mutex = new NamedMutex(false, "Global\\" + "FScruiser")) { if (mutex.WaitOne(0, false)) { //not already running //PreJit(); using (ViewController viewController = new ViewController()) using (ApplicationController appController = new ApplicationController(viewController)) { if (args.Length > 1) { appController.OpenFile(args[1]); } viewController.Run(); } Debug.Close(); } else { //is already running string message = "FScruiser is already running\r\n"; if (ViewController.PlatformType == FMSC.Controls.PlatformType.WM) { message += "To halt or activate background programs, go to Settings->System->Memory"; } MessageBox.Show(message); return; } } }
static void Main(string[] args) { Globals.WriteToDebugFile("--- Init ---"); using (NamedMutex mutex = new NamedMutex(false, "Global\\LocationScheduler\\LSCore")) { if (!mutex.WaitOne(0, false)) { Globals.WriteToDebugFile("Instance already running"); return; } GC.Collect(); // We have to force the cursor to the default one, otherwise // it will stay in the "wait" cursor". This is probably because // of the fact that the thread locks right at the startup... Cursor.Current = Cursors.Default; TasksMonitor tm = new TasksMonitor(); } Globals.WriteToDebugFile("--- Shutdown ---"); }
private void menuItemStopDaemon_Click(object sender, EventArgs e) { // Just to make sure that a daemon is running... using (NamedMutex mutex = new NamedMutex(false, "Global\\LocationScheduler\\LSCore")) { if (!mutex.WaitOne(0, false)) { // Could not grab mutex-> daemon is running _MsgQueueMgr.Write(NotifMessages.NOTIF_STOP); } else { SenseAPIs.SenseMessageBox.Show("No daemon running!", "Error", SenseMessageBoxButtons.OK); } } }
/// <summary> /// Opens an existing named mutex. /// </summary> /// <param name="name">The name of a system-wide named mutex object.</param> /// <returns>A <see cref="NamedMutex"/> object that represents a named system mutex.</returns> /// <remarks>The OpenExisting method attempts to open an existing named mutex. /// If the system mutex does not exist, this method throws an exception instead of creating the system object. /// Two calls to this method with the same value for name do not necessarily return the same <see cref="NamedMutex"/> object, even though they represent the same named system mutex.</remarks> /// <exception cref="ArgumentException">name is a zero-length string. /// -or- /// name is longer than 260 characters.</exception> /// <exception cref="ArgumentNullException">name is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="WaitHandleCannotBeOpenedException">The named mutex does not exist.</exception> public static NamedMutex OpenExisting(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (name.Length < 1) { throw new ArgumentException("name is a zero-length string."); } if (name.Length > 260) { throw new ArgumentException("name is longer than 260 characters."); } bool created; NamedMutex m = new NamedMutex(false, name, out created); if (created) { //mutex doesnt already exist m.Dispose(true); throw new WaitHandleCannotBeOpenedException(); } return m; }
/// <summary> Gets the 7zip library path.</summary> /// <exception cref="TimeoutException"> Thrown when a Timeout error condition occurs.</exception> /// <returns> The library path.</returns> /// <remarks> In WindowsCE, a file called 7z.dll in the same directory as this assembly. If it does not exist, /// an Embedded resource is extracted to this directory and used. All other platforms use the following /// logic: /// 1. [All] The value provided to a previous call to SetLibraryPath() is used. /// 2. [Full Framework] app.config AppSetting '7zLocation' which must be path to the proper bit 7z.dll /// 3. [All] Embedded resource is extracted to %TEMP% and used. (assuming build with embedded 7z.dll is used) /// 4. [All] 7z.dll from a x86 or x64 subdirectory of this assembly's directory. /// 5. [All] 7za.dll from a x86 or x64 subdirectory of this assembly's directory. /// 6. [All] 7z86.dll or 7z64.dll in the same directory as this assembly. /// 7. [All] 7za86.dll or 7za64.dll in the same directory as this assembly. /// 8. [All] A file called 7z.dll in the same directory as this assembly. /// 9. [All] A file called 7za.dll in the same directory as this assembly. /// If not found, we give up and fail. /// </remarks> private static string GetLibraryPath() { if (_libraryFileName != null && (_modulePtr != IntPtr.Zero || File.Exists(_libraryFileName))) { return(_libraryFileName); } string default7zPath = null; #if !WINCE && !MONO var sevenZipLocation = ConfigurationManager.AppSettings["7zLocation"]; if (!string.IsNullOrEmpty(sevenZipLocation) && File.Exists(sevenZipLocation)) { _libraryFileName = sevenZipLocation; return(_libraryFileName); } default7zPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); #endif #if WINCE default7zPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase); var sevenZipLocation = Path.Combine(default7zPath, "7z.dll"); if (File.Exists(sevenZipLocation)) { _libraryFileName = sevenZipLocation; return(_libraryFileName); } var bitness = "arm"; #else var bitness = IntPtr.Size == 4 ? "x86" : "x64"; #endif var thisType = typeof(SevenZipLibraryManager); #if WINCE _libraryFileName = sevenZipLocation; #else var version = thisType.Assembly.GetName().Version.ToString(3); _libraryFileName = Path.Combine(Path.GetTempPath(), String.Join(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture), new string[] { "SevenZipSharp", version, bitness, "7z.dll" })); #endif if (File.Exists(_libraryFileName)) { return(_libraryFileName); } //NOTE: This is the approach used in https://github.com/jacobslusser/ScintillaNET for handling the native component. // I liked it, so I added it to this project. We could have a build configuration that doesn't embed the dlls // to make our assembly smaller and future proof, but you'd need to handle distributing and setting the dll yourself. // Extract the embedded DLL http://stackoverflow.com/a/768429/2073621 // Synchronize access to the file across processes http://stackoverflow.com/a/229567/2073621 var guid = ((GuidAttribute)thisType.Assembly.GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString(CultureInfo.InvariantCulture); var name = string.Format(CultureInfo.InvariantCulture, "Global\\{{{0}}}", guid); using (var mutex = new Mutex(false, name)) { #if !WINCE var access = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); var security = new MutexSecurity(); security.AddAccessRule(access); mutex.SetAccessControl(security); #endif var ownsHandle = false; try { try { ownsHandle = mutex.WaitOne(5000, false); // 5 sec if (!ownsHandle) { var timeoutMessage = string.Format(CultureInfo.InvariantCulture, "Timeout waiting for exclusive access to '{0}'.", _libraryFileName); throw new TimeoutException(timeoutMessage); } } #if WINCE catch #else catch (AbandonedMutexException) #endif { // Previous process terminated abnormally ownsHandle = true; } // Double-checked (process) lock if (File.Exists(_libraryFileName)) { return(_libraryFileName); } // Write the embedded file to disk var directory = Path.GetDirectoryName(_libraryFileName); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } Exception ex = null; try { #if WINCE var resource = string.Format(CultureInfo.InvariantCulture, "{0}.{1}.7z.dll.gz", thisType.Assembly.GetName().Name, bitness); //packing of resources differ #else var resource = string.Format(CultureInfo.InvariantCulture, "{0}.{1}.7z.dll.gz", thisType.Namespace, bitness); //packing of resources differ #endif var resourceStream = thisType.Assembly.GetManifestResourceStream(resource); if (resourceStream == null) { ex = new InvalidProgramException(string.Format("Could not extract resource named '{0}' from assembly '{1}'", resource, thisType.Assembly.FullName)); } else { using (var gzipStream = new GZipStream(resourceStream, System.IO.Compression.CompressionMode.Decompress)) { using (var fileStream = File.Create(_libraryFileName)) { //Would normally use gzipStream.CopyTo(fileStream) but this is .NET 2.0 compliant. var buffer = new byte[4096]; int count; while ((count = gzipStream.Read(buffer, 0, buffer.Length)) != 0) { fileStream.Write(buffer, 0, count); } return(_libraryFileName); } } } } catch (Exception e) { ex = e; if (File.Exists(_libraryFileName)) { File.Delete(_libraryFileName); } } #if !WINCE if (default7zPath != null) { var testPath = Path.Combine(default7zPath, String.Concat(bitness, Path.DirectorySeparatorChar, "7z.dll")); if (File.Exists(testPath)) { return(_libraryFileName = testPath); } testPath = Path.Combine(default7zPath, String.Concat(bitness, Path.DirectorySeparatorChar, "7za.dll")); if (File.Exists(testPath)) { return(_libraryFileName = testPath); } var bitnessSansX = IntPtr.Size == 4 ? "86" : "64"; var sevenZipWithBitDllName = string.Format(CultureInfo.InvariantCulture, "7z{0}.dll", bitnessSansX); testPath = Path.Combine(default7zPath, sevenZipWithBitDllName); if (File.Exists(testPath)) { return(_libraryFileName = testPath); } var sevenZipAWithBitDllName = string.Format(CultureInfo.InvariantCulture, "7za{0}.dll", bitnessSansX); testPath = Path.Combine(default7zPath, sevenZipAWithBitDllName); if (File.Exists(testPath)) { return(_libraryFileName = testPath); } testPath = Path.Combine(default7zPath, "7z.dll"); if (File.Exists(testPath)) { return(_libraryFileName = testPath); } testPath = Path.Combine(default7zPath, "7za.dll"); if (File.Exists(testPath)) { return(_libraryFileName = testPath); } } #endif _libraryFileName = null; throw new SevenZipLibraryException("Unable to locate the 7z.dll. Please call SetLibraryPath() or set app.config AppSetting '7zLocation' " + "which must be path to the proper bit 7z.dll", ex); }