全局程序集缓存 (GAC) 是一种代码缓存,它在任何带有已安装的 CLR 的机器(例如已安装了 CF.NET 的 Pocket PC)上都可用。旨在跨应用程序共享的程序集可以存储在这里,而其必须有一个强名称。注意,安装了 GAC 的程序集必须有匹配的程序集名称和文件名,不包括文件扩展名(因此 MyAssembly 必须与 MyAssembly.dll 或 MyAssembly.exe 配对)。
将程序集安装在 GAC 中有什么好处?
• 一个共享的位置意味着基于 RAM 的安装不需要有重复的 DLL(同一版本且同一文件名)耗费宝贵的空间。
• 并行版本允许同一 DLL 名称的多个版本对 CF.NET 应用程序可用。在编译时,程序集存储它们所依照生成的程序集版本信息,这意味着他们将永远使用相同的程序集版本运行。因此,即便是此 DLL 的更新的版本可用,程序集也会继续使用旧的 DLL,从而防止了任何类型的向下不兼容。
• 其他好处在于在桌面上使用 GAC,但不与压缩框架共享。
所有 CF.NET 基类库都安装在 GAC 中,那么您还在等什么?您可能已经注意到了 Pocket PC 的 \Windows 目录中前缀为“GAC”的文件。CLR 将访问 Cgautil.exe 实用工具来用关于安装了 GAC 程序集的信息更新 GAC。要将您的程序集安装到 GAC 中,首先用一个强名称为其签名,然后在您的应用程序部署过程中包括一个文本文件(扩展名为 .GAC),如 CAB 文件。这个 .GAC 文件需要放在 \Windows 目录中,而且应该用 ANSI 或 UTF-8(不用 Unicode)编码。
有时候需要只允许程序只能同时运行一个实例。实现方式有很多。一. 进程互斥
原理:通过获取系统进程列表,如果发现有重名的,则表示程序已经运行了,此时新运行的进程就退出;
实现:System.Diagnostics.Process类的静态方法GetProcessesByName(string processName)
Process[] ps = Process.GetProcessesByName(Guo.exe)if(ps !=null&&ps.Length1){//发现重复进程}
写在Main方法里;判断Length大于1,是因为本身启动之后也在进程列表里了,第一次启动的时候Length==1;
优点:代码简单;
缺点:会把别的重名程序误认为是自己(如很多软件都有update.exe);可以通过复制多个exe并起不同名字来达到运行多个实例的目的;
二. 共享锁(文件、注册表)
原理:运行程序时,在一个公共的位置创建一个共享值(如在固定目录创建一个文件,或者在固定的注册表位置创建一个值),退出程序时删除该值。若运行时发现值已经在,则表示程序已经在运行,此时新运行的进程就退出;实现:略;优点:逻辑好理解;
缺点:若程序没有正常退出,共享值没有被删除,会导致程序无法再启动;
三. 线程互斥
原理:通过一个唯一标识创建进程互斥体,启动时判断互斥体是否已经存在,若存在则表示是重复进程;
实现:使用System.Threading.MutexusingSystemusingSystem.Collections.GenericusingSystem.TextusingSystem.DiagnosticsusingSystem.ReflectionusingSystem.Runtime.InteropServicesnamespaceConsoleApplication1{classProgram{///<summary///需要定义为类变量,而非局部变量///</summarystaticSystem.Threading.Mutex _mutexstaticvoidMain(string[] args){//是否可以打开新进程boolcreateNew//获取程序集Guid作为唯一标识
Attribute guid_attr = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),
typeof(GuidAttribute))stringguid =((GuidAttribute)guid_attr).Value_mutex=newSystem.Threading.Mutex(true
, guid,
outcreateNew)if(false==createNew){//发现重复进程}_mutex.ReleaseMutex()}}}优点:真正能做到同一个程序只允许运行一个进程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)