Exe 运行程序
Code  源码


    class ServiceInstaller
    {
        #region Private Variables
        //private string _servicePath;
        //private string _serviceName;
        //private string _serviceDisplayName;
        #endregion //Private Variables

        #region DLLImport
        [DllImport("advapi32.dll")]
        public static extern IntPtr OpenSCManager(string lpMachineName, string lpSCDB, int scParameter);
        [DllImport("Advapi32.dll")]
        public static extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName, string lpDisplayName,
         int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl, string lpPathName,
         string lpLoadOrderGroup, int lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);
        [DllImport("advapi32.dll")]
        public static extern void CloseServiceHandle(IntPtr SCHANDLE);
        [DllImport("advapi32.dll")]
        public static extern int StartService(IntPtr SVHANDLE, int dwNumServiceArgs, string lpServiceArgVectors);
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern IntPtr OpenService(IntPtr SCHANDLE, string lpSvcName, int dwNumServiceArgs);
        [DllImport("advapi32.dll")]
        public static extern int DeleteService(IntPtr SVHANDLE);
        [DllImport("kernel32.dll")]
        public static extern int GetLastError();
        #endregion DLLImport

        #region 安装和运行
        /// <summary>
        /// 安装和运行
        /// </summary>
        /// <param name="svcPath">程序路径</param>
        /// <param name="svcName">服务名</param>
        /// <param name="svcDispName">服务显示名称</param>
        /// <returns>服务安装是否成功</returns>
        public bool InstallService(string svcPath, string svcName, string svcDispName)
        {
            #region Constants declaration.
            int SC_MANAGER_CREATE_SERVICE = 0x0002;
            int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
            int SERVICE_ERROR_NORMAL = 0x00000001;
            int STANDARD_RIGHTS_REQUIRED = 0xF0000;
            int SERVICE_QUERY_CONFIG = 0x0001;
            int SERVICE_CHANGE_CONFIG = 0x0002;
            int SERVICE_QUERY_STATUS = 0x0004;
            int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
            int SERVICE_START = 0x0010;
            int SERVICE_STOP = 0x0020;
            int SERVICE_PAUSE_CONTINUE = 0x0040;
            int SERVICE_INTERROGATE = 0x0080;
            int SERVICE_USER_DEFINED_CONTROL = 0x0100;
            int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED |
             SERVICE_QUERY_CONFIG |
             SERVICE_CHANGE_CONFIG |
             SERVICE_QUERY_STATUS |
             SERVICE_ENUMERATE_DEPENDENTS |
             SERVICE_START |
             SERVICE_STOP |
             SERVICE_PAUSE_CONTINUE |
             SERVICE_INTERROGATE |
             SERVICE_USER_DEFINED_CONTROL);
            int SERVICE_AUTO_START = 0x00000002;
            #endregion Constants declaration.
            try
            {
                IntPtr sc_handle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
                if (sc_handle.ToInt32() != 0)
                {
                    IntPtr sv_handle = CreateService(sc_handle, svcName, svcDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, svcPath, null, 0, null, null, null);
                    if (sv_handle.ToInt32() == 0)
                    {
                        CloseServiceHandle(sc_handle);
                        return false;
                    }
                    else
                    {
                        //试尝启动服务
                        int i = StartService(sv_handle, 0, null);
                        if (i == 0)
                        {
                            return false;
                        }

                        CloseServiceHandle(sc_handle);
                        return true;
                    }
                }
                else

                    return false;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        #endregion

        #region 启动服务
        public bool StartService(string svcName)
        {
            //int GENERIC_WRITE = 0x40000000;
            //IntPtr sc_hndl = OpenSCManager(null, null, GENERIC_WRITE);
            //if (sc_hndl.ToInt32() != 0)
            //{
            //    IntPtr svc_hndl = OpenService(sc_hndl, svcName, DELETE);
            //    if (svc_hndl.ToInt32() != 0)
            //    {
            //        int i = StartService(sv_handle, 0, null);
            //        if (i != 0)
            //        {
            //            CloseServiceHandle(sc_handle);
            //            return false;
            //        }
            //        else
            //        {
            //            CloseServiceHandle(sc_handle);
            //            return false;
            //        }

                  
            //    }
            //}

            return true;
        }
        #endregion

        #region 卸载服务
        /// <summary>
        /// 卸载服务
        /// </summary>
        /// <param name="svcName">服务名</param>
        /// <returns></returns>
        public bool UnInstallService(string svcName)
        {
            int GENERIC_WRITE = 0x40000000;
            IntPtr sc_hndl = OpenSCManager(null, null, GENERIC_WRITE);
            if (sc_hndl.ToInt32() != 0)
            {
                int DELETE = 0x10000;
                IntPtr svc_hndl = OpenService(sc_hndl, svcName, DELETE);
                if (svc_hndl.ToInt32() != 0)
                {
                    int i = DeleteService(svc_hndl);
                    if (i != 0)
                    {
                        CloseServiceHandle(sc_hndl);
                        return true;
                    }
                    else
                    {
                        CloseServiceHandle(sc_hndl);
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        #endregion
    }

posted @ 2009-10-13 16:38 高度 阅读(201) 评论(0) 编辑
摘要: [代码]public enum DateSkin { defaultSkin, whyGreenSkin, extSkin }阅读全文
posted @ 2009-10-13 16:21 高度 阅读(748) 评论(0) 编辑
摘要: Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。常规服务器动态管理对象包括: dm_db_*:数据库和数据库对象 dm_exec_*:执行用户代码和关联的连接 dm_os_*:内存、锁定和时间安排 dm_tran_*:...阅读全文
posted @ 2009-02-02 14:37 高度 阅读(215) 评论(0) 编辑
摘要: 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分...阅读全文
posted @ 2008-12-23 10:02 高度 阅读(64) 评论(0) 编辑
摘要: 悟透JavaScript引子 编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。数据天生就是文静的,总想保持自己固有的本色;而代码却天生活泼,总想改变这个世界。 你看,数据代码间的关系与物质能量间的关系有着惊人的相似。数据也是有惯性的,如果没有代码来施加外力,她总保持自己原来的状态。而代码就象能量,他存在的唯一目的,就是要努力改变...阅读全文
posted @ 2008-02-25 00:31 高度 阅读(121) 评论(0) 编辑

分布式缓存系统Memcached简介与实践

缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。此时Memcached或许是你想要的。

Memcached是什么?
Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

Memcached能缓存什么?
通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

Memcached快么?

非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。

Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及Memcache失效时对数据库的访问速度。

Memcached的特点
Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

Memcached的使用
Memcached服务器端的安装 (此处将其作为系统服务安装)
  下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)
   1 解压缩文件到c:\memcached
   2 命令行输入 'c:\memcached\memcached.exe -d install' 
   3 命令行输入 'c:\memcached\memcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211
  通过 memcached.exe -h 可以查看其帮助
二   .NET memcached client library
   下载文件:https://sourceforge.net/projects/memcacheddotnet/

   里面有.net1.1  和 .net2.0的两种版本  还有一个不错的例子。

三  应用

  1 将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 等放到bin目录
  2 引用
Memcached.ClientLibrary.dll
  3 代码

 1 namespace Memcached.MemcachedBench
 2 {
 3     using System;
 4     using System.Collections;
 5 
 6     using Memcached.ClientLibrary;
 7 
 8     public class MemcachedBench 
 9     {
10         [STAThread]
11         public static void Main(String[] args) 
12         {
13             string[] serverlist = { "10.0.0.131:11211""10.0.0.132:11211" };
14 
15             //初始化池
16             SockIOPool pool = SockIOPool.GetInstance();
17             pool.SetServers(serverlist);
18 
19             pool.InitConnections = 3;
20             pool.MinConnections = 3;
21             pool.MaxConnections = 5;
22 
23             pool.SocketConnectTimeout = 1000;
24             pool.SocketTimeout = 3000;
25 
26             pool.MaintenanceSleep = 30;
27             pool.Failover = true;
28 
29             pool.Nagle = false;
30             pool.Initialize();
31 
32             // 获得客户端实例
33             MemcachedClient mc = new MemcachedClient();
34             mc.EnableCompression = false;
35 
36             Console.WriteLine("------------测  试-----------");
37             mc.Set("test""my value");  //存储数据到缓存服务器,这里将字符串"my value"缓存,key 是"test"
38 
39             if (mc.KeyExists("test"))   //测试缓存存在key为test的项目
40             {
41                 Console.WriteLine("test is Exists");
42                 Console.WriteLine(mc.Get("test").ToString());  //在缓存中获取key为test的项目
43             }
44             else
45             {
46                 Console.WriteLine("test not Exists");
47             }
48 
49             Console.ReadLine();
50 
51             mc.Delete("test");  //移除缓存中key为test的项目
52 
53             if (mc.KeyExists("test"))
54             {
55                 Console.WriteLine("test is Exists");
56                 Console.WriteLine(mc.Get("test").ToString());
57             }
58             else
59             {
60                 Console.WriteLine("test not Exists");
61             }
62             Console.ReadLine();
63             
64             SockIOPool.GetInstance().Shutdown();  //关闭池, 关闭sockets
65         }
66     }
67 }
  4 运行结果

 

   

posted @ 2008-02-07 11:11 高度 阅读(637) 评论(0) 编辑

昨天在上闲逛,偶遇到个好东西,提来给大家拜年。

-----------------------------------------------------------------------------------------

一、简介

indeXus.Net SharedCache是高性能的、分布式的内存对象系统,用于在动态WEB或Win应用程序中减少数据库的负责,提高访问速度。

SharedCache 全部的代码都是用c#写的,100% DotNet原生态。

先来看一下SharedCache 的几种方式:

1.Distributed Caching - partitioned

Partitioned 

2.Replicated Caching

Replicated Caching

3.Single Instance Caching

Single Instance Caching

 

二、小试牛刀

1.服务端

全部源码可以在SharedCache项目网站(http://www.codeplex.com/SharedCache)下载。

方案中中有7个项目

solution

可以直接在vs2008 中打开编译。

但压缩包中缺少ICSharpCode.SharpZipLib.dll,编译前䉣准备好这个。

编译成功后MergeSystem.Indexus.WinService\bin\Debug目录的文件

files

job_install.bat / job_uninstall.bat  安装/卸载windows服务

job_startService.bat / job_stopService.bat 开启/停止服务 

job_Console.bat 在控制台中加载服务。

如果不想安装到Windows服务中,直接用Job_Console.bat启动即可,默认监听端口是48888(在MergeSystem.Indexus.WinService.vshost.exe.config中配置),

console

2.测试程序

新建一个控制台程序,添加MergeSystem.Indexus.WinServiceCommon的引用。测试代码如下:

 

using System;
using MergeSystem.Indexus.WinServiceCommon.Provider.Cache;

namespace ConsoleApplication1
{
   
class Program
    {
       
static void Main(string[] args)
        {
            User[] data
= new[] { new User{ Name="user1",Age=20},
           
new User{ Name="user2",Age=1},
           
new User{ Name="user3",Age=22}
            };

           
foreach (var item in data)
            {
                IndexusDistributionCache.SharedCache.Add(item.Name, item);
            }

            Console.WriteLine(
"count={0}", IndexusDistributionCache.SharedCache.Count);

            User user
= IndexusDistributionCache.SharedCache.Get<User>("user2");

            Console.WriteLine(
"name={0},age={1}", user.Name, user.Age);

            Console.WriteLine(
"press any key to exit.");
            Console.ReadKey();
        }
    }

    [Serializable]
   
public class User
    {
       
public string Name { get; set; }
       
public int Age { get; set; }

    }
}

App.config中配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   
<configSections>
     
<section name="indexusNetSharedCache" type="MergeSystem.Indexus.WinServiceCommon.Configuration.Client.IndexusProviderSection, MergeSystem.Indexus.WinServiceCommon"/>

   
</configSections>

 
<indexusNetSharedCache defaultProvider="IndexusSharedCacheProvider">
   
<servers>
    
<add key="SrvZh03"  ipaddress="127.0.0.1" port="48888" />
   
</servers>
   
<providers>
     
<add
       
name="IndexusSharedCacheProvider"
        type
="MergeSystem.Indexus.WinServiceCommon.Provider.Cache.IndexusSharedCacheProvider, MergeSystem.Indexus.WinServiceCommon"
          
>
     
</add>
   
</providers>
 
</indexusNetSharedCache>
</configuration>

测试程序运行结果

console test

服务端响应:

console info

要注意的是,缓存的对象必需是可序列化的(Serializable)

posted @ 2008-02-07 11:09 高度 阅读(372) 评论(1) 编辑
摘要: 我们网站的脏字字典中大概有600多个词,而且会发生变化,因此简单的在数据新增/修改的时候做一次脏字过滤是不够的。在网站从.NET 1.1到2.0改版的时候,对新版的测试发现旧的脏字过滤算法耗费的时间过长,需要做一些优化。旧的算法是简单对每一个脏字调用一遍 string.replace,当然是用了StringBuilder。在cnblogs里发现了一篇讨论脏字过滤的blog http://www.c...阅读全文
posted @ 2008-01-24 22:04 高度 阅读(294) 评论(0) 编辑
摘要: VS2008 椭圆曲线签名(ECDSA) 椭圆曲线签名(ECDSA)相对传统签名算法具有速度快、强度高、签名短等优点。VS2008 中提供了椭圆曲线签名(ECDSA),遗憾的是 VS2008 提供的椭圆曲线签名目前只能在 Windwos Vista 上使用。 椭圆曲线签名(ECDSA)的工作原理与大多数签名算法类似,都是使用私钥进行签名,使用公钥进行验证。其模式与其他托管加密类相同,只是椭圆曲线...阅读全文
posted @ 2008-01-03 08:35 高度 阅读(850) 评论(3) 编辑
摘要: 我们在编写基于ASP.NET 的应用程序时,如果代码执行出错或检测到异常,一般会提示用户“返回”或“回退”,或者在多步操作、列表/详细的查看界面中,也会给用户提供回退到上一页面的链接,对于这种情况,大家很快就会想到的简单做法就是利用 Javascript 来实现,即 history.go(-1) ,但是由于 ASP.NET 页面的 PostBack ...阅读全文
posted @ 2007-10-16 15:49 高度 阅读(51) 评论(0) 编辑