上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页
摘要: 当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth(); }在控制台应用程序下创建Plugins文件夹,控制台的可执行文件... 阅读全文
posted @ 2014-09-26 18:33 Darren Ji 阅读(2891) 评论(4) 推荐(0) 编辑
摘要: CLR总是知道托管堆上的对象是什么类型,这是CLR类型安全的前提。托管堆上的每个对象都有一个"类型对象指针",指向托管堆上Type对象的一个实例。我们总是可以通过System.Object的GetType实例方法,获取对象类型。而且,GetType是非虚方法,这样子类就不能重写该方法,子类就没有办法伪装成父类。 为什么需要类型安全呢?类型伪装是许多安全漏洞的根源。CLR类型安全保证了类型的安全... 阅读全文
posted @ 2014-09-26 09:16 Darren Ji 阅读(793) 评论(0) 推荐(0) 编辑
摘要: 使用new操作符来创建对象,其背后到底发生了什么? 有一个父类Animal,Dog派生于Animal。 class Program { static void Main(string[] args) { Dog dog = new Dog(); Console.WriteLine("我能调用老祖宗Ob... 阅读全文
posted @ 2014-09-26 09:12 Darren Ji 阅读(1107) 评论(0) 推荐(0) 编辑
摘要: 通常,我们会通过线程的构造函数先创建线程再使用线程。而实际上,.NET中有些类提供的方法,其内部就是使用多线程处理的。一些封装了多线程、异步处理方法的类都符合了"事件驱动异步模式(event-based asynchronous pattern)"。以System.ComponentModel下的BackgroundWorker类来说,该类就符合这种模式。 BackgroundWorker类属... 阅读全文
posted @ 2014-09-25 16:06 Darren Ji 阅读(980) 评论(0) 推荐(1) 编辑
摘要: 当一个线程直到收到另一个线程的通知才执行相关的动作,这时候,就可以考虑使用"事件等待句柄(Event Wait Handles)"。使用"事件等待句柄"主要用到3个类: AutoResetEvent, ManualResetEvent以及CountdownEvent(.NET 4.0以后才有)。本篇包括: ※ 一个线程等待另一个线程的通知※ 2个线程互相通知等待※ 一个线程等待队列中的多个任务... 阅读全文
posted @ 2014-09-24 17:12 Darren Ji 阅读(1369) 评论(8) 推荐(0) 编辑
摘要: 当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了。本篇体验线程锁的各种用法以及线程死锁。主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.Exit处理数据同步※ 使用Mutex处理进程间数据同步※ 使用Semaphore处理数据同步※ 线程死锁 □ 使用lock处理数据同步 假设有一个类,主要用来计算该类2个字段的商,在计算商的方... 阅读全文
posted @ 2014-09-23 22:53 Darren Ji 阅读(1672) 评论(6) 推荐(1) 编辑
摘要: 假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量的数据同步。 □ 线程不安全、数据不同步的做法 class Program { static int sum = 0; static void M... 阅读全文
posted @ 2014-09-23 13:51 Darren Ji 阅读(1007) 评论(2) 推荐(1) 编辑
摘要: 在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池。可以通过TPL,ThreadPool.QueueUserWorkItem,委托与线程池交互。本篇体验:通过查看CLR代码来观察线程池及其线程。 □ 通过编码查看线程池和线程 使用ThreadPool的静态方法QueueUserWorkItem把线程放入线程池,来看线程池线程和主程序线程的... 阅读全文
posted @ 2014-09-22 16:26 Darren Ji 阅读(990) 评论(2) 推荐(0) 编辑
摘要: SOS (Son of Strike)调试扩展可以让我们在调试过程中查看CLR运行代码。SOS.dll随.NET一起安装,对于.NET 4.0来说,SOS.dll的所在位置是:C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll。 □ 安装Debugging Tools for Windows 在使用SOS之前,需要安装调试工具,在这里... 阅读全文
posted @ 2014-09-22 10:55 Darren Ji 阅读(1359) 评论(0) 推荐(0) 编辑
摘要: 有时候,我们希望手动结束一个线程。比如说,当客户端满足某种条件,让线程就此结束。如何设计呢? 线程间肯定要共享数据,假设把共享数据默认值设置成true,客户端线程在满足某种条件时把共享数据设置成false。而另外一个线程,如果共享数据一直是true,它就一直执行程序,直到共享数据为false,该线程就结束。 class Program { private stat... 阅读全文
posted @ 2014-09-21 10:42 Darren Ji 阅读(906) 评论(0) 推荐(0) 编辑
摘要: 本篇体验:如何传递数据给线程,如何给线程命名,线程的异常处理,线程池。实在是太基础的部分。 □ 传递数据给线程 ※ 使用Lambda表达式 class Program { static void Main(string[] args) { Thread t = new Thread(() => Say("hello", "w... 阅读全文
posted @ 2014-09-21 09:43 Darren Ji 阅读(1179) 评论(0) 推荐(0) 编辑
摘要: 多线程编程,有时希望每个线程的数据相互隔离互不影响,有时却希望线程间能共享数据,并保持同步。本篇体验多线程共享和不共享数据。 □ 多线程不共享数据 对于多线程,CLR到底是怎样为它们分配内存栈空间呢?是"一个萝卜一个坑",每个线程都有自己的栈空间;还是"大树底下好乘凉",所有的线程共享同一个栈空间? 我们让2个线程执行相同的静态方法,用到相同的变量,通过打印变量来求证多线程栈空间的分配情况。 ... 阅读全文
posted @ 2014-09-19 16:05 Darren Ji 阅读(2379) 评论(0) 推荐(0) 编辑
摘要: 当面对一个耗时较长的任务时,我们可以把这个任务切分成多个部分,然后同时交给多个线程处理。 □ 统计字节数组一个比较耗时的方式 以下来统计一个字节数组的大小。 class Program { static byte[] values = new byte[500000000]; static void Main(string[] args) ... 阅读全文
posted @ 2014-09-18 22:48 Darren Ji 阅读(4444) 评论(5) 推荐(2) 编辑
摘要: 在控制台应用程序集中,Main方法开始的是一个线程。如果要再创建线程,需要用到System.Threading这个命名空间。 □ 线程是怎样工作的? CLR维护着一个叫"thread scheduler"的机制,这个机制与操作系统交互。"thread scheduler"保证所有的线程有合适的执行时间,那些等待或被阻塞的线程不会占有CPU时间。在单处理器计算机上,"thread schedul... 阅读全文
posted @ 2014-09-18 17:10 Darren Ji 阅读(1308) 评论(3) 推荐(2) 编辑
摘要: 在"C#中,什么时候用yield return"中,我们了解到:使用yield return返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元素,是一种"按需供给"。本篇来重温yield return的用法,探秘yield背后的故事并自定义一个能达到yield return相同效果的类,最后体验yield break的用法。 □ 回顾yield return的用法 以下代码... 阅读全文
posted @ 2014-09-18 13:22 Darren Ji 阅读(3813) 评论(2) 推荐(3) 编辑
摘要: 在"C#中List是怎么存放元素的"中,分析了List的源码,了解了List是如何存放元素的。这次,就自定义一个泛型集合类型,可实现添加元素,并支持遍历。 该泛型集合类型一定需要一个添加元素的方法,在添加元素的时候需要考虑:当添加的元素超过当前数组的容量,就让数组扩容;为了支持循环遍历,该泛型集合类型必须提供一个迭代器(实现IEnumerator接口)。 public class MyL... 阅读全文
posted @ 2014-09-17 23:55 Darren Ji 阅读(2296) 评论(2) 推荐(0) 编辑
摘要: 假设有一个规定长度的数组,如何扩容呢?最容易想到的是通过如下方式扩容: class Program { static void Main(string[] args) { int[] arrs = new[] {1, 2, 3, 4, 5}; arrs[5] = 6; } } 报错... 阅读全文
posted @ 2014-09-17 22:02 Darren Ji 阅读(14877) 评论(4) 推荐(0) 编辑
摘要: 查看是否安装.NET Framework→%SystemRoot%\System32→如果有mscoree.dll文件,表明.NET Framework已安装 查看安装了哪些版本的.NET Framwork→开始-运行→输入cmd→输入如下命令dir %WINDIR%\Microsoft.Net\Framework\v* 查看安装的所有CLR版本→打开"VS2012命令提示"→输入CLRV... 阅读全文
posted @ 2014-09-17 16:19 Darren Ji 阅读(1193) 评论(0) 推荐(0) 编辑
摘要: 本篇体验静态变量、静态构造函数和静态类。 静态变量 静态变量位于栈上,它是一个全局变量,在编译期就已经生成。 public class Cow { public static int count; private int id; public Cow() { id = ++count; ... 阅读全文
posted @ 2014-09-17 09:20 Darren Ji 阅读(1001) 评论(0) 推荐(1) 编辑
摘要: 在C#中,sizeof用来计算类型的大小,单位是字节。有这样的一个类: public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } 在客户端,试图使用sizeof计算该类型的大小。 class Prog... 阅读全文
posted @ 2014-09-16 22:55 Darren Ji 阅读(9219) 评论(0) 推荐(0) 编辑
摘要: 每个托管堆上的对象实例除了包含本身的值外,还包括:○ Type Object Ponter: 指向Type对象实例。如果是同类型的对象实例,就指向同一个Type对象实例。○ Sync Block Index:在多线程情况下用来控制同步 namespace ConsoleApplication1 { class Program { static void Main(... 阅读全文
posted @ 2014-09-16 21:36 Darren Ji 阅读(613) 评论(0) 推荐(0) 编辑
摘要: 本篇体验引用类型转换:子类转换成父类,父类转换成子类,以及不是子父级关系类之间的转换。 □ 隐式转换:子类转换成父类 public class Animal { public int _age; public Animal(int age) { this._age = age; } }... 阅读全文
posted @ 2014-09-16 17:47 Darren Ji 阅读(1792) 评论(0) 推荐(1) 编辑
摘要: 假设有这样一个值类型struct。 public struct Size { public int Length; public int Width; public int Area() { return Length*Width; } } □ 客户端,给所有stru... 阅读全文
posted @ 2014-09-15 16:32 Darren Ji 阅读(26150) 评论(1) 推荐(1) 编辑
摘要: 当把一个值类型赋值给引用类型,这个过程可以看作是"装箱"。 object a = 10; 以上,堆栈上的过程大致是:1、在栈上开辟空间给变量a2、在堆上开辟空间,习惯上把该空间看作是"箱子"3、把10"装箱" 变量a指向堆上值为10的对象,换句话说,变量a的值是堆上对象的地址。 现在,如果我们想让a=11,可能首先想到的是:让"箱子"内的10自增1,变成11。 尝试这样做: ojec... 阅读全文
posted @ 2014-09-15 15:49 Darren Ji 阅读(945) 评论(0) 推荐(0) 编辑
摘要: 本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换。 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 →查看Cow.cs文件 using System; using System.Reflection; [assembly: AssemblyVersion("3.3.3.3")] publi... 阅读全文
posted @ 2014-09-14 22:00 Darren Ji 阅读(2622) 评论(1) 推荐(1) 编辑
摘要: 本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式。 □ C#编译器和CLR运行时如何查找程序集 C#编译器在哪里?--在C:\Windows\Microsoft.NET\Framework\v4.0.30319中 →删除F盘as文件夹中所有的exe和dll文件→把上一篇全局程序集缓存文件夹(C:\Windows\Microsoft.NET\assembly\... 阅读全文
posted @ 2014-09-14 14:54 Darren Ji 阅读(1416) 评论(2) 推荐(2) 编辑
摘要: 全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集。当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集。 为什么需要全局程序集缓存?假设程序A引用B程序集,程序C也引用B程序集,在这种情况下,可以把B程序集放到一个全局程序集缓存中是明智的做法。 □ 使用全局缓存程序集 →删除F盘as文件夹中所有dll和exe后缀... 阅读全文
posted @ 2014-09-14 14:50 Darren Ji 阅读(4047) 评论(0) 推荐(1) 编辑
摘要: 当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集"。强名称程序集可以防止被仿冒或篡改。本篇首先创建一个强名称程序集,接着模拟篡改程序集,看看最终结果如何? □ 创建一个强名称程序集 →在"C#程序集系列08,设置程序集版本"和"C#程序集系列09,程序集签名"中,在F盘的as文件夹中创建了一些文件→删除所有除了.cs类型的所有文件→创建一个密... 阅读全文
posted @ 2014-09-14 14:47 Darren Ji 阅读(3438) 评论(2) 推荐(2) 编辑
摘要: 在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够。本篇体验程序集的签名。 □ 程序集的签名 →F盘as文件夹下有多个文件→在程序集所在文件夹创建密匙→打印密匙密匙是一堆乱码,这是经过加密了。→在密匙的基础上创建公匙Public Key→打印公匙Public Key注意:这里的public token是public key经过哈希算法而获得的... 阅读全文
posted @ 2014-09-13 23:31 Darren Ji 阅读(3735) 评论(0) 推荐(0) 编辑
摘要: 区别一个程序集,不仅仅是程序集名称,还包括程序集版本、程序集公匙、程序集文化等,本篇体验通过界面和编码设置程序集版本。 □ 通过Visual Studio设置程序集版本 →右键项目,选择"属性",选择"应用程序"→点击"程序集信息",设置如下,点击确定→点击项目Properties文件夹下的AssemblyInfo.cs,可以看到程序集版本已经设置生效[assembly: AssemblyVe... 阅读全文
posted @ 2014-09-13 17:34 Darren Ji 阅读(3716) 评论(0) 推荐(0) 编辑
摘要: 以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创建程序集,程序集是很容易被篡改的。本篇体验篡改程序集。 →清空F盘as文件夹下的所有文件→在as文件夹下创建Dog.cs类,用记事本打开,编写如下,保存using System; public... 阅读全文
posted @ 2014-09-13 16:36 Darren Ji 阅读(1668) 评论(0) 推荐(0) 编辑
摘要: CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→把MainClass.cs编译成程序集→反编译MyDll.dll,在1.txt文件中呈现ildasm /out:1.txt MyDll.dll→打开1.txt文件1.txt // Metad... 阅读全文
posted @ 2014-09-12 18:43 Darren Ji 阅读(2859) 评论(0) 推荐(0) 编辑
摘要: 本篇体验在一个程序集中包含多个module。 □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存using System; public class MyFirstModule { public static void Hello() { Console.WriteL... 阅读全文
posted @ 2014-09-12 15:53 Darren Ji 阅读(2454) 评论(6) 推荐(1) 编辑
摘要: 本篇在一个程序集包含多个module的场景下体验internal的含义。 →查看F盘as文件夹下的文件→删除MainClass.exe→把MyFirstModule和MySecondModule组装到一个程序集中去现在,MyDll.dll程序集中包含了2个module。→反编译,把MyDLL.dll的IL代码显示到3.txt文件中→打开3.txt文件// Metadata version: v4.... 阅读全文
posted @ 2014-09-12 14:48 Darren Ji 阅读(1706) 评论(0) 推荐(1) 编辑
摘要: 我们经常在项目中引用程序集。通常情况下,一个程序集包含一个module,但一个程序集也可以包含多个module。本篇就来体验:在一个可以被编译成.exe可执行文件的.cs文件中引用多个module。 □ 创建第一个module→在前面2篇文章中,F盘的as文件夹中存放了若干程序集等文件。→打开"VS2012开发人员命令提示",输入如下命令,最终清空了F盘的as文件夹中的所有内容→在F盘的as文... 阅读全文
posted @ 2014-09-12 12:02 Darren Ji 阅读(2912) 评论(1) 推荐(1) 编辑
摘要: 继续上一篇"C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序",在F盘的as文件夹中已经有了若干程序集。本篇体验使用记事本查看可执行程序集的IL代码。 →打开"VS2012开发人员命令提示",输入如下命令,并按回车在as文件夹中多了1.txt和1.res这2个文件→输入如下命令打开1.txt // Microsoft (R) .NET Framework I... 阅读全文
posted @ 2014-09-12 08:58 Darren Ji 阅读(1672) 评论(0) 推荐(1) 编辑
摘要: 本篇主要体验:编写C#,IL代码,用"VS2012开发人员命令提示"编译成程序集,并运行程序。 □ C#文件编译为程序集 →在F盘创建as文件夹→在as文件夹下创建MyClass.cs→用记事本打开编写如下代码,并保存using System; public class MyClass { public static void PrintSth() { Cons... 阅读全文
posted @ 2014-09-11 23:52 Darren Ji 阅读(2665) 评论(0) 推荐(1) 编辑
摘要: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。 □ 通过委托执行方法 class Program { static void Main(string[] args) { Example ... 阅读全文
posted @ 2014-09-11 22:29 Darren Ji 阅读(42113) 评论(5) 推荐(3) 编辑
摘要: 在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。 举例:把订阅报纸的人看作是观察者,把报纸看作被观察对象。每当有新的新闻就要通知订阅报纸的人。本篇分别用实现接口和使用委托事件的方式来实现。 □ 通过实现接口实现 观察者接口,把接收到的新闻显示出来。 public interface IObserver { v... 阅读全文
posted @ 2014-09-11 15:39 Darren Ji 阅读(2221) 评论(3) 推荐(0) 编辑
摘要: .NET的异常处理机制用来发现、处理运行时错误。如果开发人员没有提供异常的处理机制,就默认采用.NET的机制。 通常使用try...catch...finally捕获异常。try { //有可能发生异常 } catch(Exception ex) { //处理异常 } finally { //清理 } ○ 如果没有异常发生,就直接到finally语句块中。○ final... 阅读全文
posted @ 2014-09-10 23:06 Darren Ji 阅读(14510) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页

我的公众号:新语新世界,欢迎关注。