最近在看重温NET的经典书籍《CLR in C#》跟几年前读的时候感觉完全不同,于是打算写博客记录一下这次的读书笔记。

CLR:公共语言运行时,是一个可以被多个编程语言使用的运行库。CLR并不关心开发人员用什么语言来编写的,只要编译器是面向CLR的就可以了。假设我们用C#编写代码,C#编译器检查语法和分析源代码,最终结果会生产一个托管模板。托管模块就是一个是一个标准的32位的PE32文件。

IL:每个面向CLR编译器生产的丢是IL(中间语言)代码还有完成的元数据,元数据总是与IL代码文件关联的,元文件总是嵌入在dll/exe文件中,并嵌入在最终的托管模块中,所以IL代码与元数据永远不会不同步。

一般编译器会默认将生成的托管模块生成一个程序集,CLR直接打交道的是程序集(assembly),程序集包含一个或多个托管模块,以及资源文件,还有清单的数据块逻辑组合 

JIT:及时编译,当程序运行时要执行一个方法,首先必须要将IL代码转换为CPU指令,这是通过JIT将CLR代码转换成CPU指令。

 

方法第一次调用过程?

1. 当程序第一次运行时,会调用JITCompiler函数,它可以知道调用了那些方法,以及定义该方法的类。

2. 然后JITCompiler会在定义该类型的程序集的元数据中查找被调用方法的IL代码

3.分配内存块 

4. JITCompiler验证IL代码并将代码转换成本地CPU指令。将指令保存在第3步分配的内存中

5. JITCompiler将被调用方法地址改为第2步的内存地址

6. 跳转到上述代码块上执行代码

 

再次调用该方法?

在一个程序中,我们经常反复调用同一个方法,当再次调用该方法时就不需要重复进行验证了,可以直接调用内存块中已有的本地代码,完全跳过JITCompile函数的验证和编译过程。所以同一方法只有在第一次调用时会产生一些性能损失,后续调用就可以全速进行了。 

 

 

因为CLS(公共语言规范)存在,允许我们在一种语言中使用另一种语言。

CLI.NET公共语言基础结构,CLI和.NET是有区别的,前者是公开标准,而后者是微软对这一标准的实现,Mono则是CLI的又一实现,它从来不是“可移植的.NET”。同样,C#是.NET Framework量身订做的程序语言,而不是NET

posted @ 2011-08-09 21:44 Jack.Wang 阅读(25) 评论(0) 编辑

好久都没写博客了,今天写一般记录对CentOS一些体验。

CentOS是 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,而且在 RHEL 的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。

今天在CentOS终于完成了mysql的安装,步骤:

1.安装mysql

yum -y install mysql mysql-server php-mysql

ps:卸载 yum -y remov xxxx 

 (目前只知道yum 命令,主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题)

2.安装mysql扩展
yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql 

3、设置mysql数据库root帐号密码。

mysqladmin -u root password ‘123456’

 这样会有error 1045错误

 于是为了解决这个错误在网上大量的寻找解决方案

1. killall mysqld(杀掉所以mysql的进程)

2./etc/rc.d/init.d/mysqld status (查看mysql状态)

3.# mysqld_safe --user=mysql --skip-grant-tables --skip-networking & (安全模式下面进入mysql)

4. # mysql -u root mysql

5.mysql> update user set password=password('123456') where user='root'(设置 root 用户的密码)

6.mysql> quit (关闭mysql)

7.service mysqld start(启动mysql)

8.# mysql -u root -p(会让你输入刚设置的密码)

 

 

 

 

posted @ 2011-07-09 20:16 Jack.Wang 阅读(74) 评论(0) 编辑

今天在看《程序员》杂志看到一道题目:SQL的一张表中有个自增的ID字段,但是现在不连续,写一条SQL语句取出某个位置到某个位置之间的数据。

这题目很简单,但是当时第一个想到的是用top + not in的方式去取出数据,后来想想都是SQL2005的时代了,之间在写一些分页的时候,也用过

数据库分页的方式,但是一时又想不起来于是查了一个msdn,原来是ROW_NUMBER ( )  ,语法如下:

ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

SQL语句:
Select * From (Select (ROW_NUMBER() OVER(ORDER BY ID asc)) AS rownum,* From [TABLENAME]) t
Where rownum BETWEEN 1 AND 20  

备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数
<partition_by_clause>:将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序

 

返回类型:bigint

例子,假设有张tbusers表,有UserID 与UserName,我们取出第20条~30条的记录

1)top方式

 select top 10 UserName from tbUsers where UserID not in(select top 20  UserID from tbUsers)

2) ROW_NUMBER ()方式

select UserID, UserName,row_num from
(
 select *, row_number() over (order by UserID) as row_num from tbUsers
) t

where row_num between 21 and 30 

 

 

posted @ 2011-02-15 21:13 Jack.Wang 阅读(100) 评论(0) 编辑
Using关键字

1)引入命名空间

     using可以引入命名空间,using namespace

     在net程序中,我们最常见的不外乎在类文件头引用所要用到类库的命名空间。命名空间是.NET程序在逻辑上的组织结构,而并非实际的物理结构,是一种避免类名冲突的方法,用于将不同的数据类型组合划分的方式 。

2)创建命名空间别名

     我们在引用office的一些命名空间的时候都喜欢引用别名,因为使用全部的名称实在是太长了,如:using MSWord = Microsoft.Office.Interop.Word;  这样程序里面就可以直接用MSWord了

3)强制资源清理

    在程序过程中引用using,可以强制清理非托管资源,不收GC的控制。在using引用结束之后,会隐示的调用Disposable的方法

 using(Stream s=new  Stream())

{

}
相当于 

  Stream f = new Stream(); 

  try 
      {   } 
  catch() 
       {   } 
  finally 

    {

         f.Disposable();  

    }

using 语句获取一个或多个资源,执行一个语句,然后处置该资源。     

 

 

 

 

 

 

 

posted @ 2011-02-12 15:04 Jack.Wang 阅读(21) 评论(0) 编辑

今天看了dragonpig与dudu的改进版本的数据绑定,在此测试了一下

新建页面Student.aspx页面

public partial class Test_Student : System.Web.UI.Page
{
    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        var students = new[] { 
         new Student{Name="mike",Age=23},
         new Student{Name="jane", Age=12},
         new Student{Name="frank",Age=25},
         new Student{Name="susan",Age=32},
      };
        rptStudents.DataSource = students;
        DataBind();
    }
    protected virtual TREsult ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func)
    {
        var item = base.GetDataItem();
        return func((TEntity)item);
    }
    protected TResult Eval<TResult>(Func<Student, TResult> func)
    {
        return ExpHelper<Student, TResult>(func);
    }
}
在前台添加
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
   <ul>
   <asp:Repeater ID="rptStudents" runat="server">   
   <ItemTemplate>
      <li>
      <%#Eval(n=>n.Age)%>---<%#Eval(n=>n.Name)%>
      </li>
   </ItemTemplate>
   </asp:Repeater>
   </ul>
    </form>
</body>

</html> 

posted @ 2011-01-30 15:07 Jack.Wang 阅读(17) 评论(0) 编辑
摘要: 今天看了一下老版本的系统,Url看的我有点心寒了,看的我都不知道url是什么意思,于是想在下一版本引入UrlRewriter们的url可读性。记得以前在做一些demo的时候用过Intelligencia.UrlRewriter,一个开源的UrlRewriter工具.下一个版本我们在4.0上开发了,记得在mvc时候的url传递都是通过UrlRoute的方式进行了,于是就尝试了在WebForm的下面使用UrlRoute。我们新建一个Login.aspx,有一个超链接<a href='<%=GetRouteUrl("StudentRoute",new {id=1}) %>'>Test</a>GetR阅读全文
posted @ 2011-01-27 15:49 Jack.Wang 阅读(85) 评论(1) 编辑
摘要: 最近一些同事,还有一些朋友,总是问我为什么我的系统不能发送邮件,大家第一反应是邮件服务器挂了,就在那坐等,于是乎等到了天荒地老。某一天突然去上公司邮箱,突然能够收到邮件,也能发送邮件,可是系统依旧不能发送。于是乎抓耳挠腮,这到底为什么呢。为什么我们不能在网站服务器上telnet mail.xxxx.com 25 邮件服务器下呢。如果都不能连接,怎么可能能够发送。如果在本地可以发送,服务器上不可以,肯定是服务器上有防火墙把25端口屏蔽掉了。阅读全文
posted @ 2011-01-07 10:08 Jack.Wang 阅读(20) 评论(0) 编辑
摘要: 今天查阅了一下msdn,偶然发现Linq的一些介绍。以前用Linq只局限于Linq to SQL,突然发现还有很多惊奇的用法,可以让开发人员大大的降低代码。下面就不详细的介绍了,直接转向msdn.语言集成查询 (LINQ)http://msdn.microsoft.com/zh-cn/library/bb397926.aspxLINQ and File Directories:http://msd...阅读全文
posted @ 2010-12-04 12:25 Jack.Wang 阅读(90) 评论(1) 编辑
摘要: 前几个月做了一个Silverlight考试系统,之所以用Silverlight主要在考试里面防止作弊。防作弊这里就不说 。之前只满足了1024*768,以及更高,现在上头说也要满足800*600,我个天哪,那不是以前的布局都要改动了。看了一下页面布局的代码,我的神内,里面的宽度定死了最宽1000,下面我说说我更改的思路:1.将里面布局代码涉及到宽度的全部都去掉2.获取屏幕分辨率的大小(HtmlPa...阅读全文
posted @ 2010-10-26 11:45 Jack.Wang 阅读(370) 评论(1) 编辑
摘要: 最近,打算在UpdatePanel中使用FCKeditor时,发现了一个小问题:当点击Panel内的按钮进行AsynPostBack后,FCKeditor控件中先前所录入的内容便丢失了。 在Google上查了下,发现了解决方法: 1.首先在页面中添加如下JS脚本: <script language="javascript" type="text/javascript"> // Some...阅读全文
posted @ 2010-08-26 19:52 Jack.Wang 阅读(148) 评论(0) 编辑