zoukankan      html  css  js  c++  java
  • CLR Via CSharp读书笔记(1):CLR的执行模型

    ch01-1-WinInstall.bat

    @ECHO OFF
    
    REM The following directory is for .NET 2.0
    set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
    set PATH=%PATH%;%DOTNETFX2%
    
    echo Installing WindowsService...
    echo ---------------------------------------------------
    InstallUtil /i "C:\Program Files (x86)\YourCompany\WinServiceFolder\WinServiceName.exe"
    
    echo ---------------------------------------------------
    pause
    echo Done.

    ch01-2-WinUnInstall.bat

    @ECHO OFF
    
    REM The following directory is for .NET 2.0
    set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
    set PATH=%PATH%;%DOTNETFX2%
    
    echo Installing WindowsService...
    echo ---------------------------------------------------
    InstallUtil /u "C:\Program Files (x86)\YourCompany\WinServiceFolder\WinServiceName.exe"
    
    echo ---------------------------------------------------
    pause
    echo Done.

    实现C#程序只允许运行一个实例的几种方法详解 

    方法一:
    使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.
    把program.cs文件里的Main()函数改为如下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace TempTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                bool runone;
                Mutex run = new Mutex(true, "single_test", out runone);
    
                if (runone) // 判断runone是关键
                {
                    run.ReleaseMutex();
                    Console.WriteLine("My Temp Test");
                    Console.ReadLine();
                }
            }
        }
    }

    方法二:采用判断进程的方式,我们在运行程序前,查找进程中是否有同名的进程,同时运行位置也相同,如是没有运行该程序,如果有就就不运行.在C#中应用System.Diagnostics名字空间中的Process类来实现,

    主要代码如下: 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Reflection;
    
    namespace TempTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (RunningInstance() == null)
                {
                    Console.WriteLine("My Temp Test");
                    Console.ReadLine();
                }
            }
    
            public static Process RunningInstance()
            {
                Process current = Process.GetCurrentProcess();
                Process[] processes = Process.GetProcesses();
                foreach (Process process in processes)
                {
                    if (process.Id != current.Id) // 忽略当前进程
                    {
                        if (Assembly.GetExecutingAssembly().Location.Replace("/", @"/") == current.MainModule.FileName)
                        {
                            return process; // 返回其他进程实例
                        }
                    }
                }
                return null;
            }
        }
    }

    方法三:全局原子法,创建程序前,先检查全局原子表中看是否存在特定原子A(创建时添加的),存在时停止创建,说明该程序已运行了一个实例;不存在则运行程序并向全局原子表中添加特定原子A;退出程序时要记得释放特定的原子A哦,不然要到关机才会释放。C#实现如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Reflection;
    
    namespace TempTest
    {
        class Program
        {
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            public static extern UInt32 GlobalAddAtom(String lpString); //添加原子
    
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            public static extern UInt32 GlobalFindAtom(String lpString); //查找原子
    
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom); //删除原子
    
            static void Main(string[] args)
            {
                UInt32 aAtom = GlobalFindAtom("temp_test");
                if (aAtom != 0) // 找到原子("temp_test")
                {
                    return;
                }
                GlobalAddAtom("temp_test");
                Console.WriteLine("My Temp Test");
                Console.ReadLine();
    
                GlobalDeleteAtom(aAtom);
            }
        }
    }
  • 相关阅读:
    设计模式学习--面向对象的5条设计原则之单一职责原则--SRP
    设计模式学习--面向对象的5条设计原则(转)
    oracle 存储过程创建报错 Procedure created with compilation errors
    查看临时表空间占用最多的用户与SQL
    查看表空间文件以及利用率、修改、删除表空间文件大小
    aliyun阿里云alibabaMaven仓库地址——加速你的maven构建
    快速配置java环境变量
    oracle 月份中日的值必须介于 1 和当月最后一日之间
    Oracle 修改dmp的表空间
    oracle 空表导出dmp会报错
  • 原文地址:https://www.cnblogs.com/thlzhf/p/2787246.html
Copyright © 2011-2022 走看看