文章分类 -  CLR

CLR相关
非托管C++代码调用C#编写的dll方法
摘要:CLR VIA C#这本书里面的内容,在网上好像很少关于这方面的内容,贴出来以后留着看。C#调用C++编写的dll,一般都是直接用dllimport,这个资料很多。C++调用C#编写的dll,一般方法都是先用托管C++将C#的dll进行一次封装,然后由非托管C++调用封装好的dll。CLR VIA C#在讲寄宿和应用程序域的内容时,提供了一个非托管C++直接调用的方法。原理就是,在非托管代码中手动启动CLR加载应用程序域来运行托管的dll,从而调用其中的方法。代码如下:#include <Windows.h>#include <MSCorEE.h>#include &l 阅读全文
posted @ 2011-02-16 17:22 RIVERSPIRIT 阅读(667) 评论(0) 推荐(0)
揭示同步块索引
摘要:一:大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针和同步块索引(SyncBlockIndex)。同步块索引这个东西比起它的兄弟类型指针更少受人关注,显得有点冷落,其实此兄功力非凡,在CLR里可谓叱咤风云,很多功能都要借助它来实现。 接下来我会用三篇来介绍同步块索引在.NET中的所作所为。 既然本章副标题是从lock开始,那我就举几个lock的示例: 代码1 代码2 代码3 代码4 上面四种代码,对于加锁的方式来说(不讨论其他)哪一种是上上选?对于这个问题的答案留在本文最后解答。 让我们先来看看在Win32的时代,我们如何做到CLR中的lock的效果。在Win32时,Wi 阅读全文
posted @ 2011-01-04 15:55 RIVERSPIRIT
C#中的lock关键字
摘要:首先给出MSDN的定义:lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。先来看看执行过程,代码示例如下:假设线程A先执行,线程B稍微慢一点。线程A执行到lock语句,判断obj是否已申请了互斥锁,判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实),如果不存在,则申请一个新的互斥锁,这时线程A进入lock里面了。这时假设线程B启动了,而线程A还未执行完lock里面的代码。线程B执行到lock语句,检查到obj已经申请了互斥锁,于是等待;直到线程A执行完毕,释放互斥锁,线程B才能申请 阅读全文
posted @ 2011-01-04 15:53 RIVERSPIRIT 阅读(139) 评论(0) 推荐(0)