11 2012 档案
摘要:个人认为两者都可以认为是常量,但是却又是有区别的。首先看看两者所支持的类型:const 只支持基元类型(所谓基元类型是指编译器直接支持的类型,也就是像int,char,string等等在C#编译器中定义了关键字的类型)。readonly 可以支持所有类型。然后再看看两者所限定常量的本质:const 限定的是变量的引用以及变量所代表的值。readonly仅仅限定的是变量的引用。(如果是引用类型的话,变量所代表的值是能够改变的)最后看看编译器对这两者进行的处理:const当编译器遇到一个对const对象的引用时,编译器会将const变量所代表的值直接嵌入生成的IL代码中,也就是说编译完后这段代码.
阅读全文
摘要:今天和同事在讨论一个CLR的问题,题目如下:classProgram{staticvoidMain(string[]args){Bb=newB();Console.ReadKey();}publicclassA{publicstaticvoidPrint(){Console.WriteLine("A");}publicA(){Print();}}publicclassB:A{publicstaticvoidPrint(){Console.WriteLine("B");}publicB(){Print();}}View Code classProgram{
阅读全文
摘要:平台确定 通过第一节,我们知道:编译器在PE文件中写入了大量的元数据。其中在PE32(+)中有一个machine字段用来标识该程序集所面向的平台(一般应该是x86,x64,不确定(Any CPU)). 在当前运行平台与程序集面向平台兼容的情况下,程序集为以所指定的平台类型运行(比如:面向x86则分配32从位地址空间,为其加载x86版本的所引用系统程序集;面向x64则为其分配64位的地址空间,为其加载x64版本的所引用系统程序集;如果any cpu则根据当前运行平台确定。) 实例解剖CLR运行模型 以如下代码为例: classProgram {...
阅读全文
摘要:说到.NET基础,我觉得应该首先应该要知道一组概念,我觉得作为.NET程序员,这应该算是常识。有可能我目前的理解也不算正确,希望能在以后的积累中逐步完善。CLR- CLR (Common Language Runtime)它为.NET Application提供一个运行时的环境。毕竟.NET程序和普通的Windows应用程序(比如说用C++开发的程序)运行方式是不一样的。在运行时,它有自己的内存管理机制,有自己的执行模型,有自己的异常处理,有自己的线程同步等。而这些都是由CLR提供。相当于一个容器。CTS- CTS (Common Type System) .Net是一个基于类型的平台,所有.
阅读全文
摘要:C++中有函数指针,而C#中与之对应的便是委托。那在PInvoke的过程中传入回调函数的方法应该是传入委托。PInvoke会将委托封送为函数指针传递到C++中。Sample:C++代码:typedefchar*(*__cdeclAddCallBack)(constchar*a,constchar*b);_declspec(dllexport)void_cdeclCallBackDelegate(AddCallBackcallback){char*result=0;if(callback)result=callback("Mynameis","Jensen"
阅读全文
摘要:IntPtr是托管环境中用来描述非托管环境中指针的类型。其所占内存大小由运行时的系统环境所决定(其实是因为在不同的系统环境中指针所占的字节数不一样,32位系统为4个字,64位系统为8个字节)。个人认为IntPtr主要有两种用途: 作为不透明指针这种情况下托管环境中不需要了解该指针的意义,仅仅保存在内存中,在需要时传送给非托管环境。举个例子:假设我们用C++实现了一个Http服务器,然而我们需要为提供C#接口启动和停止服务。C++代码:classHttpService{private:int_port;public:HttpService(){}voidstart(intport){_po...
阅读全文
摘要:其实从理论上讲结构体的和一般的基本值数据类型的封送没有太大的区别,因为都是栈上内存块的处理(当然如果结构体内有引用类型的成员也需要处理堆上的内存块)。Example:(最基本的结构体封送)C++ Code:structPerson{public:LPCSTRname;intage;};_declspec(dllexport)void_stdcallPrintPerson(Personperson){setlocale(LC_ALL,"chs");wprintf(L"PersonName:%s,Age:%d",person.name,person.age)
阅读全文
摘要:如果是写过C++的肯定一提到字符就会想到字符编码(Multibyte或Unicode)。写.NET程序的便不会考虑这个,因为在CLR环境中默认会采用Unicode编码。(其实刚毕业的时候写了很久的.NET程序却完全不知道编码这回事,因为在.NET环境中好像不知道编码技术也不会对开发有什么影响。因此个人感觉出于对计算机科学系统学习,最好还是从非托管环境开始学习程序设计)。那在调用非托管的方法时,如何解决编码问题呢?答案是要用到DllImportAttribute的CharSet属性。根据MSDN对CharSet的说明如下:CharSet可能有:Ansi调用时将字符参数封送为Ansi编码的字符Un
阅读全文
摘要:最近需要在C#中调用C++代码,正好学习一下.NET中的平台调用服务(Platform Invoke Service)。在此记录下学习的心得。我会从以下几方面去学习:1. Platform Invoke的基础(对应.NET类库的基本用法,基本数据结构的封送规则)2.Platform Invoke in CLR (2) --字符的封送(Marshal)3. Platform Invoke in CLR (3) --结构体的封送(Marshal)4.Platform Invoke in CLR (4) --不透明指针(IntPtr)和Marshal工具类5. Platform Invoke i..
阅读全文
浙公网安备 33010602011771号