雁过请留痕...
代码改变世界

随笔分类 - .Net

[mvc] 过滤器filter一览

2018-05-07 17:11 by xiashengwang, 96 阅读, 收藏, 编辑
摘要:1、mvc的过滤器种类 阅读全文

[mvc] 简单的forms认证

2018-05-07 17:09 by xiashengwang, 75 阅读, 收藏, 编辑
摘要:1、在web.config的system.web节点增加authentication节点,定义如下: 2,新增AccountController。 3、Login.cshtml 4、浏览器输入http://localhost:44324/Account/Login,输入web.config中定义的用 阅读全文

依赖注入:Ninject学习笔记

2017-11-30 16:23 by xiashengwang, 3426 阅读, 收藏, 编辑
摘要:依赖注入(DI)就不多说了,可以自行百度,本笔记整理自Pro ASP.NET MVC5。 1,Ninject安装 Ninject是一个开源的注入容器,可以通过VS的Nuget进行安装。由于是在mvc中应用,需要安装下面3个类库。 Ninject Ninject.Web.Common Ninject. 阅读全文

IIS7.5配置SSL

2016-11-30 16:50 by xiashengwang, 1263 阅读, 收藏, 编辑
摘要:1,首先需要准备两个证书(CA证书,服务器证书)。 CA证书由公共的CA机构提供,widnow系统内部已经内置了很多这类证书,如图(日文系统)。 服务器证书是导入到IIS里面用的。 2,有了上面的认识,我们就开始准备这两个证书。 1)生成一个CSR文件(https://csr.chinassl.ne 阅读全文

【转】使用lockbits方法处理图像

2015-01-07 14:11 by xiashengwang, 497 阅读, 收藏, 编辑
摘要:许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高得多。 你可能会发现DotNet采用托管机制,大多数情况下微软会推荐你使用托管代码,理由是便捷和安全。实际应用中,直接操作内存中的数据块是很少见的,尽管如此,图像处理恰恰是这类为数不多的情况之一,因为使用托管代码的效率低的难以忍受,特别是对巨幅图... 阅读全文

DataTable 行删除

2014-12-24 15:08 by xiashengwang, 2827 阅读, 收藏, 编辑
摘要:今天在阅读一个项目中的代码时,发现删除DataTable的数据时用的dataTable.Clear(); 由于以前自己习惯都是用dataTable.Rows.Clear();因此突然感觉到很茫然,难道这两者有啥不一样?于是一阵百度,Bing搜索,在加上Reflector的帮助,结论如下:1,data... 阅读全文

接口与virtual,override,new关键字

2014-07-14 17:56 by xiashengwang, 1294 阅读, 收藏, 编辑
摘要:一,类继承接口1,首先我们定义一个简单的ITeacher接口,并定义一个Professor类继承它。 public interface ITeacher { void Print(); } public class Pro... 阅读全文

控制WinForm中Tab键的跳转

2014-05-15 16:48 by xiashengwang, 7473 阅读, 收藏, 编辑
摘要:一,需求在Winform中,默认情况下,按下Tab键,光标会按照我们设定的TabIndex值从小到大进行跳转。但如果用户要求按下Tab键跳转到特定的控件,这种要求还是很合理的,比如用户只想输入几个必须填的项目。我们可以在配置文件中配置这些必须填写的项目,并设定他们的跳转顺序。这样程序也更加灵活,利于... 阅读全文

Linq to Sql 动态条件另类实现方法

2014-03-07 14:23 by xiashengwang, 1657 阅读, 收藏, 编辑
摘要:其实我也不知道是不是另类的,反正我找了好久园子里和其他资源。无外乎两类1,构造动态表达式的,这个真心繁琐,我是懒人,不想弄表达式。2,拼SQL语句,直接执行,这个和ado.net就没有啥区别了。我想继续用Linq,有不想用上面的两种方法,于是我测试了下面这种方法,结果完全符合预期,看看是怎么写的吧。记录在这里,以备查阅 var result = from s in ct.dbContext.LT_Survey join r in ct.dbContext.LT_Inquiry on s.InquiryCode... 阅读全文

协变(covariant)和逆变(contravariant)

2014-01-21 16:15 by xiashengwang, 378 阅读, 收藏, 编辑
摘要:我们知道子类转换到父类,在C#中是能够隐式转换的。这种子类到父类的转换就是协变。而另外一种类似于父类转向子类的变换,可以简单的理解为“逆变”。上面对逆变的简单理解有些牵强,因为协变和逆变只能针对接口和代理类型。而父类和子类之间不存在这种逆变的概念。协变和逆变的本质都是子类安全的转到父类的过程。下面就来加深下印象,先定义两个类Car和Baoma public class Car { } public class Baoma : Car { }明显Baoma(宝马)是Car的子类1,先来看看协变协变在C#中要用out关键字标明,用这个关键字就表示参数T只能用于函... 阅读全文

枚举Enum和常量0之间的恩怨

2013-11-29 15:13 by xiashengwang, 1909 阅读, 收藏, 编辑
摘要:1,任何为0的常量表达式都能隐式的转换成枚举Enum。对于这一点,在程序中没少吃苦头。特别是对于函数重载的情况,往往让人一头雾水。看看下面的代码(摘自MSDN),你能猜到输出吗?public enum E{ Zero = 0, One = 1,} class A{ public A(string s, object o) { System.Console.WriteLine("{0} => A(object)", s); } public A(string s, E e) { System.Console.WriteLine("{0} => A(Enu 阅读全文

Lamda表达式的参数捕获,太酷了

2013-11-28 11:22 by xiashengwang, 5580 阅读, 收藏, 编辑
摘要:lamda表达式有了参数捕获这个功能,让Action这个委托变得无所不能。Action委托就是无参数,无返回值的一个代理类型。它只能对应于下面这种类型的函数声明。 public void Function() { //Do something } public void Function2() { //Do something } public void Function3() { //Do something }假设我们定义一个共通的执行... 阅读全文

IIS7上传文件大小設定

2013-09-29 15:24 by xiashengwang, 209 阅读, 收藏, 编辑
摘要:1、首先、修改Web.Config中的maxRequestLength、单位是KB;executionTimeout单位是秒。例:maxRequestLength=1024(1MB)executionTimeout=3600(60分) 2、上面设定好后、Web.Config的maxAllowedContentLength也必须要设定。单位:Byte、下面的例子设定大小为:1G。 注意:要使2的設定生效,要确保C:\Windows\System32\inetsrv\config\applicationhost.config中的下面的节点为“Allow”。modify the ov... 阅读全文

.Net中的内存分配问题

2013-09-29 15:13 by xiashengwang, 306 阅读, 收藏, 编辑
摘要:最近在测试的时候,要求测试内存不足的情况。我不想去开很多的程序来占用内存,那样太麻烦了,也不太精确。于是就写一个小程序来占用内存,想法很简单,就是声明一个Byte数组在占用内存,没想到这么简单的想法却没能正常工作,出乎我的所料,经过一番折腾,终于搞清楚了原因。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows. 阅读全文

别误用IsDigit与IsNumber函数

2013-07-27 19:51 by xiashengwang, 17606 阅读, 收藏, 编辑
摘要:1、起因最近发现程序中有一段控制TextBox数字输入的代码,相信大家都不会太陌生,如下: void int_KeyPress(object sender, KeyPressEventArgs e) { const char Delete = (char)8; if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Delete) { e.Handled = true; } }乍一看,好像没有啥问题,但... 阅读全文

双行表头DatagridView的简单实现

2013-07-16 16:38 by xiashengwang, 4086 阅读, 收藏, 编辑
摘要:DatagridView默认不支持多行表头的实现,一些第三方的控件,比如Spread就可以,因此要实现这个功能,只能自己想办法了。介绍两种思路:1,用重写DataGridView的Paint等方法,可以重画表头,这个实现起来较为复杂,费时费力,此处略去。2,利用两个DataGridView,一个DataGridView用来显示第一行标题,另一个DatagridView用来显示第二行表头以及数据部分。实现中遇到一个问题,当列数很多的时候,第二个DatagridView会出现水平滚动条,拉动滚动条,第一个DatagridView并没有随着同步滚动,解决这个问题的方法是在第二个DatagridVie 阅读全文

VS2010 如何制作项目模板

2012-09-11 16:14 by xiashengwang, 4292 阅读, 收藏, 编辑
摘要:模板的制作在vs2010中制作模板文件非常简单,直接点击菜单中的文件à保存为模板,就可以另存为工程模板或是项目模板了。保存选项里可以选择模板的图标。做好的模板需要放到下面这两个目录中:C:\Documents and Settings\wz\My Documents\Visual Studio 2010\Templates\ProjectTemplatesC:\Documents and Settings\wz\My Documents\Visual Studio 2010\Templates\ItemTemplates然后新建一个工程,你就发现这些模板已经可以用了。模板中参数使用注 阅读全文

Vs2010 sp1补丁太让人纠结

2012-09-08 12:18 by xiashengwang, 20897 阅读, 收藏, 编辑
摘要:最近下载了vs2010的sp1补丁包,没看上这个补丁包的其他功能扩展,唯一看中的就是它对MSDN 查看器的更新。以前大家都知道vs2010的帮助文档要在浏览器里查看,由于没有了索引功能,简直太不习惯了。这个补丁包对此进行了升级,安装后可以像以前的VS2008 一样浏览帮助文档。我下载的是iso文件,差不多1.5G,本以为可以顺利安装,结果太悲催了,安装了一晚上还在那卡住(系统:Win7 32位旗舰版),于是取消,重新安装,还是卡住。按照网上的一个方法,将vs2010的setup文件改名后考到install目录下,那个卡住的地方是过了,结果又在后面的一个地方卡住,这个sp1包真是折腾死人,哥不陪 阅读全文

混合线程同步核心篇——自定义混合同步锁,Monitor,lock,ReaderWriterLockSlim・・・

2012-08-31 10:18 by xiashengwang, 2133 阅读, 收藏, 编辑
摘要:前两篇博客,分别介绍了用户模式和内核模式的同步构造,由于它们各有优势和劣势。本文将介绍如何将这两者的优势结合在一起,构建一个性能良好的同步机制。一,实现一个简单的混合同步锁#region hybird lock/// /// 简单的混合同步锁/// private sealed class Hybi... 阅读全文

基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)

2012-08-29 17:46 by xiashengwang, 2190 阅读, 收藏, 编辑
摘要:一、内核模式构造内核模式构造,采用的是windows操作系统来同步线程,比VolatileRead,VolatileWrite,Interlocked等用户模式的构造慢很多。相对于用户模式的构造,它也有自己的优点:1,不用像用户模式那样占着cpu“自旋”,浪费cpu资源。2,内核模式可同步在同一机器不同进程中运行的线程。3,可实现本地和托管线程相互之间的同步。4,一个线程可以一直阻塞,直到一个集合中的内核对象全部可用,或部分可用。(WaitAll,WaitAny)5,阻塞一个线程时,可以指定一个超时值,超过这个时间就解除阻塞。二、FCL提供的内核模式构造层次结构WaitHandle(抽象类) 阅读全文

基元线程同步——Interlocked Anything模式

2012-08-29 14:19 by xiashengwang, 558 阅读, 收藏, 编辑
摘要:上一篇基元线程同步——基础,非阻塞同步(VolatileRead,VolatileWrite,volatile,Interlocked)已经对Interlocked类做了比较详细的分析,这一篇是对Interlocked类的一个模式进行补充说明。如果没用过Interlocked类,可以看看上面的这篇文章。这个模式的名字是Jeffrey给起的,它究竟要解决什么问题,我们为什么要用它?带着这些疑问,我们来看看它的应用场景。看看下面这个设定最大值的例子: private static Int32 Maximum(ref int target, int value) { ... 阅读全文

基元线程同步——基础,非阻塞同步(VolatileRead,VolatileWrite,volatile,Interlocked)

2012-08-25 11:22 by xiashengwang, 2567 阅读, 收藏, 编辑
摘要:一、基元用户模式和内核模式。基元(Primitive):指代码中可以使用的最简单的构造。有两种基元构造:用户模式(user-mode)和内核模式(kernel-mode)。1,用户模式。它是用CPU指令来协调线程,这种协调是在硬件中发生的,所以速度会快于内核模式。但是也意味着,Windows操作系统永远也检测不到一个线程在一个基元用户模式构造上阻塞了。由于在一个基元用户模式构造上阻塞的线程永远不认为已经阻塞,所以线程池不会创建新的线程来替换这种阻塞的线程。另外,这些CPU指令只是阻塞线程极短的时间。缺点:只有Windows系统的内核才能停止一个线程的执行。用户模式中的线程可能会被系统抢占,但很 阅读全文

线程同步——优势、劣势

2012-08-25 10:16 by xiashengwang, 404 阅读, 收藏, 编辑
摘要:一、线程同步好处:多个线程同时访问共享数据时,防止数据被损坏。二、线程同步带来的问题:1,实现比较繁琐,而且容易出错。必须对多个线程可能同时访问的所有数据,用额外的代码包围起来,以获得和释放一个同步锁。这需要由程序员来保证没有遗漏,对多线程共享的数据的加锁工作。并且,在程序完成时,需要进行压力测试以保证多个线程并发时,结果如预期。2,它会损害性能。获取和释放一个锁是需要时间的。因为需要额外的调用一些方法,并且需要协调调度下一个获得锁的线程。3,每次只能允许一个线程访问资源。这是锁的全部意义所在,但也是问题所在,因为阻塞一个线程可能会造成更多的线程被创建。三、线程同步建议:1,线程同步并不是一件 阅读全文

研究BackgroundWorker后发现:AsyncOperation和SynchronizationContext的差异真的很大!

2012-08-22 15:58 by xiashengwang, 1226 阅读, 收藏, 编辑
摘要:今天研究BackgroundWorker代码时发现,两处代码的写法有些不一致,于是好奇的测试了一番,以为能测出BackgroundWorker的一个bug。结果大家都知道microsoft胜了。下面来看看过程,BackgroundWorker类里的ReportProgress方法public void ReportProgress(int percentProgress, object userState){if (!this.WorkerReportsProgress) throw new InvalidOperationException("BackgroundWorker_Wo 阅读全文

APM异步编程模型的优势

2012-08-21 14:11 by xiashengwang, 1059 阅读, 收藏, 编辑
摘要:我们之所以要花大力气学习APM,就必须要清楚它能解决实际编程中的那些难题。以及现有的技术为什么不行。简单点说:APM是基于IAsyncResult接口的,采用的BeginXXX和EndXXX的形式来实现异步。下面这几点就是APM的优势:1,线程执行是异步的,不会阻塞调用线程。这一点也是我们使用异步的主要目的,我们不就是希望后台处理一些耗时操作吗?2,任务完成可以得到通知。(非阻塞)3,任务可以实现进度报告。(需要额外的辅助代码支持)4,可以有返回值。5,参数可以是多个。再看看Thread,ThreadPool,Task能实现上面的几点?这三个中,Task是相对完善的一个,对于第2点它可以通过C 阅读全文

定时器Timer的选择

2012-08-18 18:20 by xiashengwang, 205 阅读, 收藏, 编辑
摘要:FCL提供了好几个Timer供我们选择,但却让很多人分不清他们的使用场合。下面来总结一下:System.Threading的Timer类。要在线程池上定时执行后台任务,他就是就好的选择。System.Windows.Forms的Timer类。这个类可以通过Vs的设计界面拖拽,它和UI线程是相关的,它使用的就是UI线程,所以在这里面执行UI更新的操作不会报线程非法访问的错。但是,如果在定时执行的函数里有长时间的运行任务,则会阻塞UI线程,造成界面”假死“。System.Windows.Threading的DispatcherTimer类。这个是System.Windows.Forms的Timer 阅读全文

线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

2012-08-18 16:39 by xiashengwang, 2072 阅读, 收藏, 编辑
摘要:不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程。对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦出现异常没有捕获,将会带来难以发现的bug,进而造成系统崩溃。而多线程本身也不是一朝一夕就能学好的,必须不断的去学习总结,所以我个人认为你要用一种线程模型,首先要对它有足够的了解,特别是对异常的捕获。如果你没有完全的把握,最好在实际开发中谨慎的用多线程。1,APM异步编程模型。采用BeginXXX和EndXXX方法。关于异常的捕捉,对于刚调用BeginXXX抛出的异常,异步操作可能还没有进入队列。 阅读全文

颜色分段显示,线性填充的一个Demo

2012-08-02 17:51 by xiashengwang, 1440 阅读, 收藏, 编辑
摘要:1,指定一个开始颜色,一个结束颜色,进行填充。2,生成指定数量的,这两个颜色中间的过渡色,这个对地图表示等功能需要分段颜色表示的很有用。效果图:先看第一个功能,填充渐变的颜色:主要就是利用LinearGradientBrush这个画刷 lblStartColor.Click += new EventHandler(lblColor_Click); lblEndColor.Click += new EventHandler(lblColor_Click); void lblColor_Click(object sender, EventA... 阅读全文

GC垃圾回收——有用的函数和类

2012-08-01 16:10 by xiashengwang, 3924 阅读, 收藏, 编辑
摘要:1,AddMemoryPressure和RemoveMemoryPressure 这两个方法主要用于本地资源,比如一个位图占用了50M本地内存,但是托管对象只包含一个HBitMap(4字节或8字节)。但CRL并不知道这个内存压力,它可能允许你分配数百个位图,因为它们占用的托管内存太少了。这两个方法的目的就是要告诉GC它实际的本地资源用了多少内存量,GC知道这个信息后会调整它的垃圾回收策略,当压力变大时,他就强制执行垃圾回收。 private void MemoryPressureDemo(int size) { //创建一组对象,并指定它们的... 阅读全文

《CLR via C#》笔记——垃圾回收

2012-07-31 20:58 by xiashengwang, 987 阅读, 收藏, 编辑
摘要:本篇目录1,垃圾回收的基本概念 1.1 小对象堆和大对象堆 1.2 垃圾回收中的“代” 1.3 堆和“代”的关系2,啥时执行垃圾回收?3,垃圾回收器是如何工作的? 3.1标记无效对象。 3.2 压缩阶段。 3.3 终结揭秘4 ,Dispose模式:强制对象清理资源1,垃圾回收的基本概念1.1 小对象堆和大对象堆 我们都知道,CLR将我们的引用类型分配到托管堆上。这里指的托管堆实际是一个笼统的称呼。它实际是由一个小对象堆(small object heap,SOH)和一个大对象堆(large object heap,LOH)组成的。为对象分配空间时,将对象分为小对象(small object). 阅读全文

《CLR via C#》笔记——异常和状态管理

2012-07-30 12:48 by xiashengwang, 2239 阅读, 收藏, 编辑
摘要:目录一,定义异常二,异常处理机制 2.1 try块 2.2 catch块 2.3 finally块 2.4 CLS和非CLR异常三,System.Exception类四,抛出异常五,自定义异常类六,用可靠性换取开发效率七,指导原则和最佳实践 7.1 善用finally块 7.2 不要什么都捕捉 7.3 得体的从异常中恢复 7.4 从不可恢复的异常中回滚——维持状态 7.5 隐藏实现细节来维持契约八,未处理异常九,约束执行区(CER)十,代码契约一,定义异常 什么时候应该抛异常?当一个类型的成员(如方法,属性)不能完成任务时,就应抛出异常。面向对象的编程大大... 阅读全文

《CLR via C#》笔记——可空值类型

2012-07-20 18:15 by xiashengwang, 257 阅读, 收藏, 编辑
摘要:一,可空值类型 顾名思义,这种类型支持null值。在FCL中被定义为System.Nullable类型。这是一个结构体类型(struct),所以,不要认为System.Nullable是一个引用类型,它仍然是一个值类型。要使用可空值类型,在代码中可以这样写: Nullable x = 10; Nullable y = null; Console.WriteLine("x: HasValue={0} Value={1}", x.HasValue, x.Value); Console.WriteLine("y:... 阅读全文

《CLR via C#》笔记——线程基础

2012-07-20 14:22 by xiashengwang, 1059 阅读, 收藏, 编辑
摘要:一,Windows为什么要支持线程 进程(process)是应用程序的一个实例要使用的资源的一个集合。每个进程都有一个虚拟化的地址空间,确保一个进程的代码不会被另外一个进程访问,这确保了应用程序的健壮性和安全性。但当应用程序执行一个无限循环,系统中又只有一个CPU时,他会执行无限循环,不能执行其他东西。为此,Mircorsoft引入了线程。线程(thread)的职责就是对CPU进行虚拟化,Windows为每个进程提供了该进程专用的线程。如果应用程序进入无限循环,与代码相关的进程会被“冻结”,但其他进程可以继续执行。二,线程开销线程会产生空间和时间上的开销。每个线程都包含以下要素:●线程内核对象 阅读全文

《CLR via C#》笔记——运行时序列化(3)

2012-07-18 20:54 by xiashengwang, 728 阅读, 收藏, 编辑
摘要:七,流上下文 前面讲过,一组序列化好的对象可以有许多的目的地;同一进程,同一台机器的不同进程,不同机器的不同进程等。在一些比较少见的情况下,一个对象可能想知道他要在什么地方被反序列化,从而以不同的方式生成它的状态。例如:一个包装了Windows信号量(semaphore)的一个对象,如果它知道反序列化到同一个进程中,就可能决定序列化它的内核句柄(kernel handle),这是因为内核句柄在同一进程中有效。然而,如果它知道要反序列化到同一机器的不同进程中,就可能对信号量的字符串名称进行序列化。最后,如果对象知道它要反序列化到一台不同的机器上的一个进程中,就可能抛出异常,因为信号量值在同一台机 阅读全文

《CLR via C#》笔记——运行时序列化(2)

2012-07-18 20:52 by xiashengwang, 1181 阅读, 收藏, 编辑
摘要:五,格式化器如何序列化类型实例为了简化格式化的操作,FCL在System.Runtime.Serialization命名空间提供了一个FormatterServices类型。该类型只包含静态方法,而且不能被实例化。以下的步骤描述了格式化器如何自动序列化一个应用了SerializableAttribute的对象。1,格式化器调用FormatterServices的GetSerializableMembers方法:public static MemberInfo[] GetSerializableMembers(Type type,StreamingContext context)这个方法利用反射 阅读全文

《CLR via C#》笔记——运行时序列化(1)

2012-07-18 20:43 by xiashengwang, 870 阅读, 收藏, 编辑
摘要:一,运行时序列化的作用序列化(Serialization)是将一个对象转换成一个字节流的过程。反序列化(Deserialization)是将一个字节流转换回一个对象的过程。在对象和字节流之间的转化是非常有用的机制。下面是一些例子。●应用程序的状态可以轻松保存到一个磁盘或数据库中,并在应用程序下次运行时恢复。Asp.net就是利用序列化和反序列化来保存和恢复会话状态的。●一组对象可轻松复制到剪贴板,在粘贴回同一个或另一个应用程序。事实上,Windows窗体和WPF就是利用了这个功能。●一组对象可以克隆放到一边作为“备份”;与此同时,用户操纵一组“主”对象。●一组对象可轻松地通过网络发给另一台机器 阅读全文

《CLR via C#》笔记——AppDomain(2)

2012-07-17 09:22 by xiashengwang, 1849 阅读, 收藏, 编辑
摘要:四,卸载AppDomain AppDomain很出色的一个能力就是它允许卸载。卸载AppDomain会导致CLR卸载AppDomain中的所有程序集,还会释放AppDomain的Loader堆。为了卸载一个AppDomain,可以调用AppDomain的静态方法UnLoad,这将导致CLR执行一系列的操作来卸载AppDomain。1,CLR挂起进程中执行过托管代码的所有线程。2,CLR检查所有线程栈,查看哪些线程正在执行要卸载的那个AppDomain中的代码,或者哪些线程会在某个时候返回至要卸载的那个AppDomain。在任何一个栈上,如果有准备卸载的AppDomain,CLR都会强迫对应的线 阅读全文

《CLR via C#》笔记——AppDomain(1)

2012-07-17 09:13 by xiashengwang, 3819 阅读, 收藏, 编辑
摘要:一,Appdomain概述 CLR COM服务器初始化时,会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。宿主可以通过CLR创建额外的AppDomain。AppDomain的唯一作用就是隔离。下面是它的具体功能。●一个AppDomain中的代码创建的对象不能由另一个AppDomain中的代码直接访问。●AppDomain可以卸载。●AppDomain可以单独保护。AppDomain在创建后,会应用一个权限集,它决定了在这个AppDomain中运行的程序集的最大权限。●AppDomain可以单独实施配置。AppDomain在创建后,会关联一组配置设置。这些设置主要影响CL 阅读全文

《CLR via C#》笔记——程序集的加载和反射(3)

2012-07-16 17:54 by xiashengwang, 1188 阅读, 收藏, 编辑
摘要:五,使用反射发现类型的成员1,发现类型成员 字段,构造器,方法,属性,事件和嵌套类都可以被定义为类型的成员。FCL定义了一个System.Reflection.MemberInfo的抽象基类,封装了一组所有类型成员都通用的属性。从MemberInfo派生的一组类,每个类都封装了与一个特定类型成员相关的属性。下面是这个类型的层次结构。下面的程序演示如何查询一个类型的成员并显示与它们相关的信息。以下代码中,处理AppDomain中加载的所有程序集中的公共类型,对每个类型,调用GetMembers方法,并返回由MemberInfo派生对象构成的一个数组;对每个成员都显示他们的种类(字段,构造器,方法 阅读全文

《CLR via C#》笔记——程序集的加载和反射(2)

2012-07-16 17:41 by xiashengwang, 491 阅读, 收藏, 编辑
摘要:四,设计支持加载项的应用程序 构建可扩展应用程序时,接口是中心。可以利用基类来代替接口,但接口通常是首选,因为它允许加载项开发人员选择他们自己的基类。下面描述了如何构建这样的应用程序。1,创建一个“宿主SDK”(Host SDK)程序集。它定义一个接口,接口的方法作为宿主应用程序和加载项应用程序之间的通信机制使用。接口的参数和返回类型,尝试使用MSCorLib.dll中定义的类型或接口。如果要传递并返回自己定义的数据类型,也应该在这个“宿主SDK”程序集中定义。一旦搞定接口的定义,就可以为这个程序集赋一个强名称(版本控制),然后把它打包并部署到合作伙伴或用户那里。一旦发布就应避免对该程序集的做 阅读全文

《CLR via C#》笔记——程序集的加载和反射(1)

2012-07-16 17:25 by xiashengwang, 2129 阅读, 收藏, 编辑
摘要:一,程序集加载 JIT编译器在将IL代码编译成本地代码时,会查看IL代码中引用了那些类型。在运行时,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表的记录项来确定哪一个程序集定义了引用的类型。在AssemblyRef元数据记录项中记录了程序集强名称的各个部分—包括名称,版本,公钥标记和语言文化。这四个部分组成了一个字符串标识。JIT编译器尝试将与这个标识匹配的程序集加载到当前的AppDomain中。如果程序集是弱命名的,标识中将只包含名称。1,Assembly的Load方法 在内部CLR使用Assembly的Load方法来加载这个程序集,这个方法与Win32的LoadLi 阅读全文

sscli2.0(Rotor) win7+vs2008编译

2012-07-01 23:19 by xiashengwang, 263 阅读, 收藏, 编辑
摘要:一,下载sscli2.0http://www.microsoft.com/en-us/download/details.aspx?id=4917二,编译sscli2.0需要安装Perlhttp://www.activestate.com/Products/ActivePerl/一路安装即可。三,解压sscli2.0后,需要修改一些文件,具体可参考这篇blog:http://blogs.msdn.com/b/jeremykuhne/archive/2008/02/19/sscli-2-0-and-visual-studio-2008.aspx唯一还要修改一个地方的是,打开env.core.pl文 阅读全文

winForm 国际化的简单实现

2011-12-23 14:17 by xiashengwang, 197 阅读, 收藏, 编辑
摘要:国际化就是要实现多语种的界面切换。首先,我们不可能用if else等语句来根据选择的不同语种对所有的控件一个一个的设值,这样太麻烦了。.Net提供了国际化相关的支持,主要放在System.Globalization命名空间下。下面是一个简单的实现,麻雀虽小,五脏俱全。这个程序是最近写的一个程序,就在这基础上进行改造,关键是弄懂原理。1> 首先要加入Resource文件在VS工程-->添加新项目里加入三个resource文件,Resource文件的作用就是存放我们的界面控件的显示字符串。这里我们要实现3种语言的切换,所有加入了3个,分别命名为:Resource.en-US.resx, 阅读全文

在for,foreach语句中小心使用控件的SendToBack,BringToFront方法

2011-12-15 23:03 by xiashengwang, 990 阅读, 收藏, 编辑
摘要:今天写了段VB。Net遍历控件的方法,乍一看没有什么问题,但结果却出人意料,control集合的元素没有遍历完,并且有重复的元素。 Public Sub SetControlLableAndPropertyFromXml(ByVal parent As Control) For Each subControl As Control In parent.Controls If subControl.HasChildren Then SetControlLableAndPropertyFromXml(subContro... 阅读全文

《CLR via C#》笔记——CLR的执行模型

2011-09-22 20:46 by xiashengwang, 201 阅读, 收藏, 编辑
摘要:一.将源代码编译成托管代码1, CLR(Common Language Runtime)公共语言运行时是一个可由多种语言使用的“运行时”,CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。如“运行时”使用异常来报告错误,所以面向“运行时”的所有语言都能通过异常来报告错误。2, 可以将编译器视为语法检查器和“正确代码”的分析器,他们检查你的代码,确定你的一切都有一些含义,然后输出你对意图进行描述的代码,不同的编程语言允许不同的语法来开发。不要低估选择的价值。如对数学和金融领域,使用APL语法比用Perl表达同样的意图更节约开发时间。3, Mic 阅读全文

Winform下KeyDown,KeyPress,KeyUp事件的总结

2011-09-15 13:26 by xiashengwang, 2231 阅读, 收藏, 编辑
摘要:在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。1) 这三个事件调用的先后顺序(MSDN) 1.KeyDown :在控件有焦点的情况下按下键时发生 2. KeyPress :在控件有焦点的情况下按下键时发生。 3. KeyUp :在控件有焦点的情况下释放键时发生。2) KeyDown和KeyPress在MSDN上的解释完全一样,都是在按下键的时候发生,那区别是什么呢?textBox1_KeyDown(object sender, KeyEventA 阅读全文

《CLR via C#》笔记——类型基础

2011-06-01 16:25 by xiashengwang, 129 阅读, 收藏, 编辑
摘要:一.所有类型都是从System.Object派生。1,下面两种类型定义完全一致://隐式派生自ObjectClass Employee{...}//显示派生自ObjectClass Employee:System.Object{…}2,System.Object的主要公共成员Equals:两个对象完全相同,返回true。GetHashCode:返回对象值的Hash码,当对象要在一个Hash表中作为Key使用时,必须重写这个方法。ToString:默认返回类型的完整名称(this.GetType().FullName),这个方法在继承类中经常都会被重写,如Int32,Boolean。ToStri 阅读全文

VS编译时会将引用参照的dll所引用的子dll一起拷贝

2011-06-01 16:20 by xiashengwang, 211 阅读, 收藏, 编辑
摘要:今天发现一个很“怪异”的现象,用VS2008编译一个工程后,发现SVN目录的某些文件(几个dll文件)又变回以前的版本了,以为是SVN出了问题,重启机器后还是有这个问题。我的VS2008工程的输出路径是指向svn的本地拷贝路径的(这样,有修改了,就可以上传最新的程序),经过一番检查,发现不是SVN的问题,是VS2008编译的问题。工程中引用了一个Main.dll,每次编译都把它拷贝到输出目录,但Main.dll自身也引用了几个dll,在我的工程中只能看见一个Main.dll的引用,看不见它的子引用,当重新编译时,VS2008会将Main.dll引用的dll一起拷贝到svn目录,这样就出现了那个 阅读全文

vs2008安装部署工程制作教程

2011-05-19 12:22 by xiashengwang, 78 阅读, 收藏, 编辑
摘要:vs2008安装部署工程制作教程1. 新建一个Class Library, 例如Name 为 CustomAction. 这个就是一个自定义安装行为的类。2. 添加安装类。在新建的Library里面添加一个 Installer Class,名字我暂时定为MyInstallerClassDll 3. 重写基类的函数 Commit Install OnAfterInstall OnAfterRollback OnAfterUninstall OnBeforeInstall OnBeforeRollback OnBeforeUninstall OnCommitted OnCommitting Rol 阅读全文