如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:首先需要定义几个结构(struct) ,便于DllImport作为返回参数调用。以下是代码:
CpuInfo.csusing System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
 * LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
 * 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
 * LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
 * LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
 */
 
/**//// <summary>
/// 定义CPU的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)] 
public struct CpuInfo
...{
    /**//// <summary>
    /// OEM ID
    /// </summary>
    public uint dwOemId;
    /**//// <summary>
    /// 页面大小
    /// </summary>
    public uint dwPageSize;
    public uint lpMinimumApplicationAddress;
    public uint lpMaximumApplicationAddress;
    public uint dwActiveProcessorMask;
    /**//// <summary>
    /// CPU个数
    /// </summary>
    public uint dwNumberOfProcessors;
    /**//// <summary>
    /// CPU类型
    /// </summary>
    public uint dwProcessorType;
    public uint dwAllocationGranularity;
    /**//// <summary>
    /// CPU等级
    /// </summary>
    public uint dwProcessorLevel;
    public uint dwProcessorRevision; 
}
MemoryInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
 * LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
 * 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
 * LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
 * LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
 */
/**//// <summary>
/// 定义内存的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MemoryInfo
...{
    /**//// <summary>
    /// 
    /// </summary>
    public uint dwLength;
    /**//// <summary>
    /// 已经使用的内存
    /// </summary>
    public uint dwMemoryLoad;
    /**//// <summary>
    /// 总物理内存大小
    /// </summary>
    public uint dwTotalPhys;
    /**//// <summary>
    /// 可用物理内存大小
    /// </summary>
    public uint dwAvailPhys;
    /**//// <summary>
    /// 交换文件总大小
    /// </summary>
    public uint dwTotalPageFile;
    /**//// <summary>
    /// 可用交换文件大小
    /// </summary>
    public uint dwAvailPageFile;
    /**//// <summary>
    /// 总虚拟内存大小
    /// </summary>
    public uint dwTotalVirtual;
    /**//// <summary>
    /// 可用虚拟内存大小
    /// </summary>
    public uint dwAvailVirtual;
}

解决方案 »

  1.   

    SystemTimeInfo.cs
    using System;
    using System.Configuration;
    using System.Runtime.InteropServices;/**//**
     * LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
     * 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
     * LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
     * LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
     */
    /**//// <summary>
    /// 定义系统时间的信息结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential)] 
    public struct SystemTimeInfo
    ...{
        /**//// <summary>
        /// 年
        /// </summary>
        public ushort wYear;
        /**//// <summary>
        /// 月
        /// </summary>
        public ushort wMonth;
        /**//// <summary>
        /// 星期
        /// </summary>
        public ushort wDayOfWeek;
        /**//// <summary>
        /// 天
        /// </summary>
        public ushort wDay;
        /**//// <summary>
        /// 小时
        /// </summary>
        public ushort wHour;
        /**//// <summary>
        /// 分钟
        /// </summary>
        public ushort wMinute;
        /**//// <summary>
        /// 秒
        /// </summary>
        public ushort wSecond;
        /**//// <summary>
        /// 毫秒
        /// </summary>
        public ushort wMilliseconds;
    }
    另外还定义了一个调用类SystemInfo.cs,代码如下:
    using System;
    using System.Configuration;
    using System.Runtime.InteropServices;
    using System.Management;
    using System.Text;/**//// <summary>
    /// SystemInfo 的摘要说明
    /// </summary>
    public class SystemInfo
    ...{
        private const int CHAR_COUNT = 128;
        public SystemInfo()
        ...{
            
        }
        [DllImport("kernel32")]
        private static extern void GetWindowsDirectory(StringBuilder WinDir, int count);    [DllImport("kernel32")]
        private static extern void GetSystemDirectory(StringBuilder SysDir, int count);    [DllImport("kernel32")]
        private static extern void GetSystemInfo(ref CpuInfo cpuInfo);    [DllImport("kernel32")]
        private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo);    [DllImport("kernel32")]
        private static extern void GetSystemTime(ref SystemTimeInfo sysInfo);    /**//// <summary>
        /// 查询CPU编号
        /// </summary>
        /// <returns></returns>
        public string GetCpuId()
        ...{
            ManagementClass mClass = new ManagementClass("Win32_Processor");
            ManagementObjectCollection moc = mClass.GetInstances();
            string cpuId=null;
            foreach (ManagementObject mo in moc)
            ...{
                cpuId = mo.Properties["ProcessorId"].Value.ToString();
                break;
            }
            return cpuId;
        }    /**//// <summary>
        /// 查询硬盘编号
        /// </summary>
        /// <returns></returns>
        public string GetMainHardDiskId()
        ...{
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
            String hardDiskID=null;
            foreach (ManagementObject mo in searcher.Get())
            ...{
                hardDiskID = mo["SerialNumber"].ToString().Trim();
                break;
            }
            return hardDiskID; 
        }    /**//// <summary>
        /// 获取Windows目录
        /// </summary>
        /// <returns></returns>
        public string GetWinDirectory()
        ...{
            StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
            GetWindowsDirectory(sBuilder, CHAR_COUNT);
            return sBuilder.ToString();
        }    /**//// <summary>
        /// 获取系统目录
        /// </summary>
        /// <returns></returns>
        public string GetSysDirectory()
        ...{
            StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
            GetSystemDirectory(sBuilder, CHAR_COUNT);
            return sBuilder.ToString();
        }   /**//// <summary>
       /// 获取CPU信息
       /// </summary>
       /// <returns></returns>
        public CpuInfo GetCpuInfo()
        ...{
            CpuInfo cpuInfo = new CpuInfo();
            GetSystemInfo(ref cpuInfo);
            return cpuInfo;
        }    /**//// <summary>
        /// 获取系统内存信息
        /// </summary>
        /// <returns></returns>
        public MemoryInfo GetMemoryInfo()
        ...{
            MemoryInfo memoryInfo = new MemoryInfo();
            GlobalMemoryStatus(ref memoryInfo);
            return memoryInfo;
        }    /**//// <summary>
        /// 获取系统时间信息
        /// </summary>
        /// <returns></returns>
        public SystemTimeInfo GetSystemTimeInfo()
        ...{
            SystemTimeInfo systemTimeInfo = new SystemTimeInfo();
            GetSystemTime(ref systemTimeInfo);
            return systemTimeInfo;
        }    /**//// <summary>
        /// 获取系统名称
        /// </summary>
        /// <returns></returns>
        public string GetOperationSystemInName()
        ...{
            OperatingSystem os = System.Environment.OSVersion;
            string osName = "UNKNOWN";
            switch (os.Platform)
            ...{
                case PlatformID.Win32Windows:
                    switch (os.Version.Minor)
                    ...{
                        case 0: osName = "Windows 95"; break;
                        case 10: osName = "Windows 98"; break;
                        case 90: osName = "Windows ME"; break;
                    }
                    break;
                case PlatformID.Win32NT:
                    switch (os.Version.Major)
                    ...{
                        case 3: osName = "Windws NT 3.51"; break;
                        case 4: osName = "Windows NT 4"; break;
                        case 5: if (os.Version.Minor == 0)
                            ...{
                                osName = "Windows 2000"; 
                            }
                            else if (os.Version.Minor == 1)
                            ...{
                                osName = "Windows XP"; 
                            }
                            else if (os.Version.Minor == 2)
                            ...{
                                osName = "Windows Server 2003"; 
                            }
                            break;
                        case 6: osName = "Longhorn"; break;
                    }
                    break;
            }
            return String.Format("{0},{1}", osName, os.Version.ToString());
        }
    }
      

  2.   

    以下是调用实例,为了简单,我在一个aspx页面中输出,不过这个程序可以在WinForm中调用:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Runtime.InteropServices;public partial class Index : System.Web.UI.Page
    ...{
        protected void Page_Load(object sender, EventArgs e)
        ...{
            if (!Page.IsPostBack)
            ...{
                SystemInfo systemInfo = new SystemInfo();
                 Response.Write("操作系统:" + systemInfo.GetOperationSystemInName() + "<br>");
                Response.Write("CPU编号:"+systemInfo.GetCpuId() + "<br>");
                Response.Write("硬盘编号:"+systemInfo.GetMainHardDiskId() + "<br>");
                Response.Write("Windows目录所在位置:" + systemInfo.GetSysDirectory() + "<br>");
                Response.Write("系统目录所在位置:" + systemInfo.GetWinDirectory() + "<br>");
                MemoryInfo memoryInfo = systemInfo.GetMemoryInfo();
                CpuInfo cpuInfo = systemInfo.GetCpuInfo();
                Response.Write("dwActiveProcessorMask" + cpuInfo.dwActiveProcessorMask + "<br>");
                Response.Write("dwAllocationGranularity" + cpuInfo.dwAllocationGranularity + "<br>");
                Response.Write("CPU个数:" + cpuInfo.dwNumberOfProcessors + "<br>");
                Response.Write("OEM ID:" + cpuInfo.dwOemId + "<br>");
                Response.Write("页面大小" + cpuInfo.dwPageSize + "<br>");
                Response.Write("CPU等级" + cpuInfo.dwProcessorLevel + "<br>");
                Response.Write("dwProcessorRevision" + cpuInfo.dwProcessorRevision + "<br>");
                Response.Write("CPU类型" + cpuInfo.dwProcessorType + "<br>");
                Response.Write("lpMaximumApplicationAddress" + cpuInfo.lpMaximumApplicationAddress + "<br>");
                Response.Write("lpMinimumApplicationAddress" + cpuInfo.lpMinimumApplicationAddress + "<br>");
                Response.Write("CPU类型:" + cpuInfo.dwProcessorType + "<br>");
                Response.Write("可用交换文件大小:" + memoryInfo.dwAvailPageFile + "<br>");
                Response.Write("可用物理内存大小:" + memoryInfo.dwAvailPhys + "<br>");
                Response.Write("可用虚拟内存大小" + memoryInfo.dwAvailVirtual + "<br>");
                Response.Write("操作系统位数:" + memoryInfo.dwLength + "<br>");
                Response.Write("已经使用内存大小:" + memoryInfo.dwMemoryLoad + "<br>");
                Response.Write("交换文件总大小:" + memoryInfo.dwTotalPageFile + "<br>");
                Response.Write("总物理内存大小:" + memoryInfo.dwTotalPhys + "<br>");
                Response.Write("总虚拟内存大小:" + memoryInfo.dwTotalVirtual + "<br>");
            }
        }
    }
    说明:前台aspx页面没有任何控件。------------------------------------------
    完整内容请见:
    http://blog.csdn.net/zhoufoxcn/archive/2007/03/20/1534949.aspx
      

  3.   

    前几天看到一个用vb.net的,终于看到c#的了。
    不知道c#有没有不用api的~~~~贪心呀:)
      

  4.   

    获取系统路径.net的方法
    Environment.SystemDirectory;
    Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
      

  5.   

    楼主很厚道。大家很满意,后果很严重。
    系统应该将  zhoufoxcn (执子之手)  归入VIP!!
    将zhoufoxcn (执子之手)的社会信用度提高9999999999%
    允许zhoufoxcn (执子之手)贷款不还
    授予zhoufoxcn (执子之手)国家英雄称号
    奖励zhoufoxcn (执子之手)北京三居室三套(位置自选)

      

  6.   

    to zswang(伴水清清)(专家门诊清洁工) :
    获取系统路径.net的方法
    Environment.SystemDirectory;
    Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
    ===============================================================
    这种办法是最直接的,我平常也是用这种办法,这里不过是提出另一种办法供大家参考。
      

  7.   

    to netfx() :前几天看到一个用vb.net的,终于看到c#的了。
    不知道c#有没有不用api的~~~~贪心呀:)
    ==================================不用API的话用WMI应该可以实现类似的功能,正在研究中,已经小有收获。如果大有收获的话,我还会吐血奉献一次的:)
      

  8.   

    如果有用纯C#+.Net类库而不用WinAPI写出来的我没有看到过,可能写不出来,写这方面的程序不如用C++
      

  9.   

    楼主多注意身体,不值得为这个吐血呀,人的生命可是只有一次。
    桌面常伴,Win32API大全~~~~~   使你不再吐血
      

  10.   

    我想知道VISTA以后,看M$的介绍WINFX里.
    WIN32的API会逐渐消失.那么用什么编程系统基层的东西?这些C#并不擅长
    用.NETFRAMWORK的类库么?WIN32 API编程还能走多远.?
      

  11.   

    采用WMI技术即可,没必要直接用API.
    硬盘情况查阅;Win32_DiskDrive
    内存情况查阅:Win32_MemoryArray
    CPU情况查阅:Win32_Processor简单示例 -- 罗列本机CPU信息 
      // ProcessorInfo.cs
      // Author by Yzl
      
      using System;
      using System.Management;
      
      public class ProcessorInfo
      {
       public static void Main(string[] args)
       {
       ManagementClass processorCls = new ManagementClass("Win32_Processor");
      
       // 罗列CPU处理器的信息
       foreach(ManagementObject processorObj in processorCls.GetInstances())
       {
       Console.WriteLine("Processor Id:"+processorObj["ProcessorId"]);
       Console.WriteLine("Processor Name:" + processorObj["Name"]);
       Console.WriteLine("Current Clock Speed:" + processorObj["CurrentClockSpeed"]);
      
       }
       }
      }
    详细请查阅:http://blog.csdn.net/yuzl32/archive/2007/03/12/1527384.aspx
      

  12.   

    to yuzl32(有酒醉):
    我代表党中央、国务院感谢你!因为对WMI不熟悉(刚接触),所以还不太了解。
    同时感谢各位XDJM的支持。
      

  13.   

    得到系统所有信息:http://www.codeproject.com/cs/system/GetHardwareInformation.asp
      

  14.   

    不用这么麻烦吧,C#不用调API一样可以轻松获取这些机器码
      

  15.   

    好象很多人都喜欢手动调用 API,在 .NET Framework 下不用调用 API 也可以的吧,好象还更方便。  ---------菜鸟。