(转)C#程序开发中经常遇到的10条实用的代码

原文地址:http://www.cnblogs.com/JamesLi2015/p/3147986.html

 

1 读取操作系统和CLR的版本 

OperatingSystem os = System.Environment.OSVersion;

Console.WriteLine(“Platform: {0}”, os.Platform);

Console.WriteLine(“Service Pack: {0}”, os.ServicePack);

Console.WriteLine(“Version: {0}”, os.Version);

Console.WriteLine(“VersionString: {0}”, os.VersionString);

Console.WriteLine(“CLR Version: {0}”, System.Environment.Version);

 

在我的Windows 7系统中,输出以下信息: 

Platform: Win32NT

Service Pack:

Version: 6.1.7600.0

VersionString: Microsoft Windows NT 6.1.7600.0

CLR Version: 4.0.21006.1

 

2 读取CPU数量,内存容量 

可以通过Windows Management Instrumentation (WMI)提供的接口读取所需要的信息。 

private static UInt32 CountPhysicalProcessors()

{

    ManagementObjectSearcher objects = new ManagementObjectSearcher(

       “SELECT * FROM Win32_ComputerSystem”);

    ManagementObjectCollection coll = objects.Get();

    foreach(ManagementObject obj in coll)

   {

       return (UInt32)obj[“NumberOfProcessors”];

   }

   return 0;

}

private static UInt64 CountPhysicalMemory()

{

  ManagementObjectSearcher objects =new ManagementObjectSearcher(

     “SELECT * FROM Win32_PhysicalMemory”);

  ManagementObjectCollection coll = objects.Get();

  UInt64 total = 0;

  foreach (ManagementObject obj in coll)

  {

      total += (UInt64)obj[“Capacity”];

   }

   return total;

}

 

请添加对程序集System.Management的引用,确保代码可以正确编译。

 

Console.WriteLine(“Machine: {0}”, Environment.MachineName);

Console.WriteLine(“# of processors (logical): {0}”, Environment.ProcessorCount);

Console.WriteLine(“# of processors (physical): {0}”  CountPhysicalProcessors());

Console.WriteLine(“RAM installed: {0:N0} bytes”,  CountPhysicalMemory());

Console.WriteLine(“Is OS 64-bit? {0}”,   Environment.Is64BitOperatingSystem);

Console.WriteLine(“Is process 64-bit? {0}”,  Environment.Is64BitProcess);

Console.WriteLine(“Little-endian: {0}”, BitConverter.IsLittleEndian);

foreach (Screen screen in  System.Windows.Forms.Screen.AllScreens)

{

    Console.WriteLine(“Screen {0}”, screen.DeviceName);

    Console.WriteLine(“\tPrimary {0}”, screen.Primary);

    Console.WriteLine(“\tBounds: {0}”, screen.Bounds);

    Console.WriteLine(“\tWorking Area: {0}”,screen.WorkingArea);

    Console.WriteLine(“\tBitsPerPixel: {0}”,screen.BitsPerPixel);

}

3 读取注册表键值对 

using (RegistryKey keyRun = Registry.LocalMachine.OpenSubKey(@”Software\Microsoft\Windows\CurrentVersion\Run”))

{

   foreach (string valueName in keyRun.GetValueNames())

   {

    Console.WriteLine(“Name: {0}\tValue: {1}”, valueName, keyRun.GetValue(valueName));

   }

请添加命名空间Microsoft.Win32,以确保上面的代码可以编译。

 

4 启动,停止Windows服务 

这项API提供的实用功能常常用来管理应用程序中的服务,而不必到控制面板的管理服务中进行操作。 

ServiceController controller = new ServiceController(“e-M-POWER”);     

controller.Start();     

if (controller.CanPauseAndContinue)      

{     

   controller.Pause();     

   controller.Continue();     

}     

controller.Stop();

 

.net提供的API中,可以实现一句话安装与卸载服务 

if (args[0] == "/i")

{

      ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });

}

else if (args[0] == "/u")

{

  ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });

如代码所示,给应用程序传入i或u参数,以表示是卸载或是安装程序。

 

5 验证程序是否有strong name (P/Invoke) 

比如在程序中,为了验证程序集是否有签名,可调用如下方法 

[DllImport("mscoree.dll", CharSet=CharSet.Unicode)]

static extern bool StrongNameSignatureVerificationEx(string wszFilePath, bool fForceVerification, ref bool pfWasVerified);

bool notForced = false;

bool verified = StrongNameSignatureVerificationEx(assembly, false, ref notForced);

Console.WriteLine("Verified: {0}\nForced: {1}", verified, !notForced);

 

这个功能常用在软件保护方法,可用来验证签名的组件。即使你的签名被人去掉,或是所有程序集的签名都被去除,只要程序中有这一项调用代码,则可以停止程序运行。

 

6 响应系统配置项的变更 

比如我们锁定系统后,如果QQ没有退出,则它会显示了忙碌状态。

 

请添加命名空间Microsoft.Win32,然后对注册下面的事件。 

. DisplaySettingsChanged (包含Changing) 显示设置

. InstalledFontsChanged 字体变化

. PaletteChanged

. PowerModeChanged 电源状态

. SessionEnded (用户正在登出或是会话结束)

. SessionSwitch (变更当前用户)

. TimeChanged 时间改变

. UserPreferenceChanged (用户偏号 包含Changing)

 

我们的ERP系统,会监测系统时间是否改变,如果将时间调整后ERP许可文件之外的范围,会导致ERP软件不可用。

 

7 运用Windows7的新特性 

Windows7系统引入一些新特性,比如打开文件对话框,状态栏可显示当前任务的进度。 

Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog ofd = new Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog();

ofd.AddToMostRecentlyUsedList = true;

ofd.IsFolderPicker = true;

ofd.AllowNonFileSystemItems = true;

ofd.ShowDialog();

 

用这样的方法打开对话框,与BCL自带类库中的OpenFileDialog功能更多一些。不过只限于Windows 7系统中,所以要调用这段代码,还要检查操作系统的版本要大于6,并且添加对程序集Windows API Code Pack for Microsoft®.NET Framework的引用,请到这个地址下载 http://code.msdn.microsoft.com/WindowsAPICodePack

 

8 检查程序对内存的消耗 

用下面的方法,可以检查.NET给程序分配的内存数量 

long available = GC.GetTotalMemory(false);

Console.WriteLine(“Before allocations: {0:N0}”, available);

int allocSize = 40000000;

byte[] bigArray = new byte[allocSize];

available = GC.GetTotalMemory(false);

Console.WriteLine(“After allocations: {0:N0}”, available);

 

在我的系统中,它运行的结果如下所示 

Before allocations: 651,064

After allocations: 40,690,080

 

使用下面的方法,可以检查当前应用程序占用的内存 

Process proc = Process.GetCurrentProcess();

Console.WriteLine(“Process Info: “+Environment.NewLine+

“Private Memory Size: {0:N0}”+Environment.NewLine +

“Virtual Memory Size: {1:N0}” + Environment.NewLine +

“Working Set Size: {2:N0}” + Environment.NewLine +

“Paged Memory Size: {3:N0}” + Environment.NewLine +

“Paged System Memory Size: {4:N0}” + Environment.NewLine +

 “Non-paged System Memory Size: {5:N0}” + Environment.NewLine,

proc.PrivateMemorySize64,   proc.VirtualMemorySize64,  proc.WorkingSet64,  proc.PagedMemorySize64, proc.PagedSystemMemorySize64,  proc.NonpagedSystemMemorySize64 );

 

9 使用记秒表检查程序运行时间 

如果你担忧某些代码非常耗费时间,可以用StopWatch来检查这段代码消耗的时间,如下面的代码所示 

System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();

timer.Start();

Decimal total = 0;

int limit = 1000000;

for (int i = 0; i < limit; ++i)

{

     total = total + (Decimal)Math.Sqrt(i);

}

timer.Stop();

Console.WriteLine(“Sum of sqrts: {0}”,total);

Console.WriteLine(“Elapsed milliseconds: {0}”,

timer.ElapsedMilliseconds);

Console.WriteLine(“Elapsed time: {0}”, timer.Elapsed);

 

现在已经有专门的工具来检测程序的运行时间,可以细化到每个方法,比如dotNetPerformance软件。

 

以上面的代码为例子,您需要直接修改源代码,如果是用来测试程序,则有些不方便。请参考下面的例子。 

class AutoStopwatch : System.Diagnostics.Stopwatch, IDisposable

{

  public AutoStopwatch()

  {

      Start();

  }

  public void Dispose()

  {

      Stop();

      Console.WriteLine(“Elapsed: {0}”, this.Elapsed);

  }

}

 

借助于using语法,像下面的代码所示,可以检查一段代码的运行时间,并打印在控制台上。 

using (new AutoStopwatch())

{

   Decimal total2 = 0;

   int limit2 = 1000000;

   for (int i = 0; i < limit2; ++i)

   {

      total2 = total2 + (Decimal)Math.Sqrt(i);

   }

}

 

10 使用光标 

当程序正在后台运行保存或是册除操作时,应当将光标状态修改为忙碌。可使用下面的技巧。 

class AutoWaitCursor : IDisposable

{

private Control _target;

private Cursor _prevCursor = Cursors.Default;

public AutoWaitCursor(Control control)

{

  if (control == null)

  {

    throw new ArgumentNullException(“control”);

  }

  _target = control;

  _prevCursor = _target.Cursor;

  _target.Cursor = Cursors.WaitCursor;

}

public void Dispose()

{

  _target.Cursor = _prevCursor;

}

}

 

用法如下所示,这个写法,是为了预料到程序可能会抛出异常 

using (new AutoWaitCursor(this))

{

...

throw new Exception();

}

 

如代码所示,即使抛出异常,光标也可以恢复到之间的状态。

转载于:https://www.cnblogs.com/tlduck/p/5202682.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ueditor的配置及使用

Ueditor官网&#xff1a;http://ueditor.baidu.com/website/ &#xff08;项目需要JSP版本&#xff1a;UTF-8版&#xff09; 1.配置 <script type"text/javascript" charset"utf-8">window.UEDITOR_HOME_URL "${ctx}/assets/plugins/uedi…

努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...

很多人都想用电脑端运行手机APP&#xff0c;但是又不知道怎么操作。纵横170yun小编推荐大家使用显卡服务器&#xff0c;在显卡服务器上运行安卓模拟器。让你轻轻松松在电脑端运行手机APP&#xff0c;甚至还可以多开噢 。如果你的电脑没有显卡&#xff0c;也没有关系&#xff0c…

Linux入门笔记——系统目录结构

目录 评论 / 根目录&#xff0c;万物起源。 /bin 包含系统启动和运行所必须的二进制程序。 /boot 包含 Linux 内核&#xff0c;最初的 RAM 磁盘映像&#xff08;系统启动时&#xff0c;由驱动程序所需&#xff09;&#xff0c;和 启动加载程序。 有趣的文件&#xff1a; /boot/…

线程故事:关于健壮的线程池

我的主题系列的另一个博客。 这次是关于线程池&#xff0c;尤其是可靠的线程池设置。 在Java中&#xff0c;线程池由Java 5中引入的ThreadPoolExecutor类实现。该类的Javadoc组织得很好。 因此&#xff0c;我不遗余力地在此处进行概述。 基本上&#xff0c; ThreadPoolExecutor…

css缩写

颜色&#xff1a; 16进制的色彩值为六位数&#xff0c;如果每两位的值相同&#xff0c;可以缩写一半。 如&#xff1a;#000000#000&#xff1b; #223344#234&#xff1b; 盒子的尺寸&#xff1a; 如margin:value; 一个值表示所有边&#xff0c;两个值表示上下&#xff0c;左右&…

win10改成ubundu主题_如何将ubuntu引导win10,修改为win10引导ubuntu

、首先用LiveCD进入ubuntu2、打开终端&#xff0c;输入&#xff1a;fdisk -l 查看自己linux的分区情况&#xff0c;我的分了4个区&#xff0c;swap&#xff0c;boot&#xff0c;/&#xff0c;home&#xff0c;对应的分别是&#xff1a;/dev/sda9 swap/dev/sda10 boot/dev/sda11…

Linux入门笔记——文件操作命令1

pwd Print name of current working directory&#xff08;打印出当前工作目录名&#xff09; cd Change directory&#xff08;更改目录&#xff09;例子&#xff1a;cd 更改工作目录到你的家目录&#xff08;和cd ~命令的运行结果是等同的 &#xff09;cd - 更…

使用MJRefresh自定义下拉刷新,上拉加载动画

有时候我们需要自己设置下拉刷新,上拉加载动画的实现,这里主要是记录下使用MJRefresh自定义下拉刷新,上拉加载动画..... 下拉刷新我们只需要继承MJRefreshGifHeader即可: 实现代码如下: - (void)prepare{[super prepare];self.stateLabel.hidden NO;self.lastUpdatedTimeLabel…

2.mybatis入门实例 连接数据库进行查询

1.新建项目&#xff0c;添加mybatis和mysql的jar包 2.在mysql中新建表user[id,name,age] CREATE TABLE users (id int(11) NOT NULL auto_increment,NAME varchar(50) default NULL,age int(11) default NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8 3.新建User类…

使用JacpFX和JavaFX2构建富客户端

创建快速且可扩展的桌面客户端始终是一个挑战&#xff0c;特别是在处理大量数据和长时间运行的任务时。 尽管Eclipse RCP和Netbeans RCP是已建立的平台&#xff0c;但其想法是建立一个轻量级的框架来异步处理组件&#xff0c;类似于Web组件。 开发人员在线程主题上的工作应较少…

lob移表空间 oracle_Oracle数据库(1)Oracle体系结构概述(一)

Oracle数据库的体系结构主要包括&#xff1a;物理存储结构、逻辑存储结构、内存结构和实例进程结构。了解了Oracle的体系结构&#xff0c;就可以对Oracle数据库有一个整体认识&#xff0c;这样有利于后续Oracle的学习。下面我们分别来了解逻辑存储结构、物理存储结构、内存结构…

Linux入门笔记——文件操作命令2

cp Copy files and directories&#xff08;复制文件和目录&#xff09; cp 选项&#xff1a; 选项 意义 -a, --archive 复制文件和目录&#xff0c;以及它们的属性&#xff0c;包括所有权和权限。 通常&#xff0c;复本具有用户所操作文件的默认属性。 -i, --interactive 在…

java 对象的上转型对象(父类)

Example5_10.java class 类人猿 {void crySpeak(String s) {System.out.println(s); } } class People extends 类人猿 {void computer(int a,int b) { int ca*b;System.out.println(c); }void crySpeak(String s) {System.out.println("***"s"***"); }…

EnglishLeaning

今天看了些hadoop官方reference感觉自己词汇量和语法真是又回到解放前了。于是&#xff0c;痛下决心要好好学习英语。找到了一些学习的方法&#xff0c;自己记录下来&#xff0c;也和大家一起借鉴 努力目标&#xff1a; 掌握大量的计算机英语术语和缩略语&#xff1b;熟练掌握计…

雇用Java EE开发人员的一些面试问题

互联网上充斥着Java开发人员的面试问题。 这些问题的主要问题是&#xff0c;它们仅证明候选人具有良好的记忆力&#xff0c;并且记住所有语法&#xff0c;结构&#xff0c;常量等。对他/她的逻辑推理没有真正的评估。 我在下面列举了一些面试问题的示例&#xff0c;这些示例根据…

手机mstsc远程工具_远程桌面连接,只需3步,轻松远程操控电脑!

远程桌面的好处远程桌面有很多好处的1.对于运维技术人员来说&#xff0c;可以随时随地管理远程主机&#xff0c;查看系统信息和硬件信息等系统性能诊断&#xff0c;远程应用管理内存、CPU等敏感信息报警提醒&#xff0c;对远程主机的一切尽收眼2.对于客户服务来说&#xff0c;可…

Linux入门笔记——type、switch、help、man、apropos、whatis、info

type 显示命令的类型switch 显示可执行程序的位置help 得到shell 内部命令的帮助文档例如&#xff1a;help cd--help 许多可执行程序支持一个 --help 选项&#xff0c;这个选项是显示命令所支持的语法和选项说明。例如&#xff1a;mkdir --helpman 显示程序手册页许多希望被命令…

linux上的常用的进程与内存优化命令

进程 ps命令 f 以树状结构显示 u 显示详细信息 a 显示所有进程 -A 显示所有进程 -u 用户名 是显示该用户下的进程 -l 更多进程详细信息 例子1. 以树状结构显示root用户下进程的详细信息 $ps fu -u root 显示结果如下 USER PID %CPU %MEM VSZ RSS TTY STAT STAR…

qbytearry有数据上限吗_金仕达大数据开发岗位面试题

金仕达-上海(1)自我介绍(2)在离线数仓&#xff0c;实时数仓中担任的角色是什么&#xff0c;介绍项目&#xff1f;数据量有多大&#xff1f;(3)实时的指标和离线指标怎么消除掉&#xff1f;有没有必要一致&#xff1f;(4)Flink上有多少个指标&#xff0c;一个指标一个jar包吗&am…

BZOJ 1012 单调队列+二分

思路&#xff1a; 维护一个单减的序列 序号是单增的 每回二分查找第一个比询问的大的值 我手懒 用得lower_bound //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; #define int long long int m,mod,top,jy,ans,tot; char ch[3]; st…