.net(李大哥)

.NET的全称是Microsoft.NET

 

其中的.NET部分 主要是 .NET Famework

net的 工作框架

是一个类似于 javaVM的解释器

 

简略的说 就是 C# VB.NET  F#等NET框架语言下的虚拟机

更低一层的说 他就是解释器

 

是C# VB 等语言的解释器

内部提供了隔离模式的 解释器 和执行单元

 

一段 C#代码被编译后 执行体本身并不是像 C++和C一样 编译成 CPU指令代码 

而是以一种中间形式从在

这种中间编码 不能直接被CPU执行

所以需要.NET框架来解释翻译

当你双击一个由 C#写的exe时

它的顺序如下:首先 入口点不同于 常规的C++ 和C程序接口

C++和C程序入口从 :1、main 标准C和C++

2、winMain

WWinMain

其中一个w表示 windows 窄字符 程序集入口

两个表示 宽字符入口

带有win的入口表示windows窗口应用程序入口点

而mian是标准C和C++的入口

他们同样适用于windows以及linux  和mac等系统的控制台入口

但是在windows下为了区分 宽字符程序入口和窄字符入口 微软定义了_tmain

这是一个中间类型

根据项目属性配置的字符集 设置使用mian还是 wmain

wmian是宽字符控制台入口点

接着我们说 windows服务的入口点

在C++里 

 

服务的入口点是从service.h的servicemain入口

这只是一个启动的入口点

但并不是整个程序的入口点

程序的入口点完全可以是mian  wmain winmain等等的

一般来说都是用

main

windows服务都是控制台

可是为什么我们看不到黑框框呢

 

因为在main中的第一个参数中 判断了 参数

如果是直接启动则以服务的方式

我们会看到人们在控制台程序其中之前加入一个参数启动

 

比如 cmd.exe -ping 127.0.0.1

这个参数就是 传递给main中的_tgchar

的参数

在main中根据 这个参数 执行不同的命令

这是 C++的程序入口点

编译后直接生成 二进制指令

.NET下的程序入口点 不是本地的

他是安全代码 

双击这个exe时 windows会按照windows原生程序的入口点启动

也就是main或者winmain

但是由于 .NET下的exe启动入口并不是本地代码 所以 当你未安装.NET框架时  启动就会失败

告诉你 应用程序正常初始化失败

而C++的程序不会有这种错误

C++的程序如果缺少依赖项 则直接告诉你 缺少那个DLL

如果版本不被目标平台支持则显示 xxxx.exe不是有效的win32 程序

比如64位编译的程序在32位系统上就会提示这种错

但是。net的64位和32位不是针对CPU的

而是 针对 .NET框架的一个特征

所以 c#下编译的64位程序和32位程序和32位下是一模一样的 

代码压缩 格式化 都一模一样 所以体积不变 只是更改了一个特征标记 让.NET知道这是一个64位程序  

而C++的编译的64位明显比32位大

 

这里的64和32是针对CPU优化的

所以 C#的程序 不管是32位或者64位下 只要你没装.NET框架 都会告诉你 应用程序正常初始化失败

而不是告诉你 这不是有效的win32 PE文件

或者不是有效的win32 应用程序

 

所以 由此可见net程序的入口点 并不是windows本身维护的

而是由NET维护

所以 当你 安装NET时 NET下的exe入口点会被写入系统注册表

注册表包含了 NET生成程序的特征

当你双击一个exe之后 系统首先检索 这是不是从main入口,这是一个序列化的过程

如果不是 则将exe交付给NET的host去启动

还记得我们调试程序时总是有个xxx.vshost.exe

类似这个原理

你双击exe之后 立马这个程序就被NET的托管服务托管了

然后托管服务加载exe和依赖项 并且将 C#的中间代码翻译成CPU机器码

然后执行 并返回执行结果

所以.NET它是微软的中间语言托管平台 和解释器

为什么说C#安全

应为 这是托管代码

只给了你安全访问的API

你想操作那些非安全的事情

可惜 .NET不提供给你接口

你想访问也没办法

.NET封装了 安全的windows API

非安全的并没有封装 

也不提供 标准C直接控制的特性

所以你想不安全都难

 

这就如同 一只关在笼子里的老虎 给你提供了窗口 给你进食 喝水 拉屎尿尿 

 

但是就只能让你做这些

就是不让你跑出来

 

所以 关在笼子里的老虎是安全的、

 

也不提供 标准C直接控制的特性

所以你想不安全都难

 
 

因此C#的的执行方式如下:C#源代码->编译后的代码->.NET Framework->OS Api->CPU

和Java类似

Java 源代码->java生成的jar和class->JavaVM->OSApi->CPU 

C++ 的程序执行如下: C++源代码->编译后的机器码->CPU

机器码和CPU之间有依赖项 但是不同与 C#和Java的是

.NET Framework是C#生成程序的上级

 也就是说C#的exe 是在.NET 上运行

而不是在OS上运行

java也一样

这就如同 ANT震源炸药

它必须借助雷管引爆 否则你把它放在火上烧 也不会有任何效果

就跟烧柴一样

C#

而C++就如同 TNT

 你不需要雷管去引爆

 只要遇到火 和猛烈摩擦和碰撞它都会直接爆炸

因此 .NET就是一个 微软的中间语言框架

至于webservice

这只是一个技术方案

.NET提供了这样的ISAPI

当你安装IIS之后 

.NET的 webservice 提供程序自动被添加到IIS的ISAPI提供程序中

 
 
 
 

一个郑大老师

C#调用C++的DLL

他死活出错

FENBUQING  ANY

分不清 Any CPU和X86

 

自己写了个呼叫系统

一个CPU平台问题 老是导致程序崩溃

因为 设备提供商提供的驱动接口都是C++的DLL

 

类似于 WINAPI int Open_Drive(int nType,int iNumber);这样的导出接口

Any CPU是NET平台下的编译特征

意思是 告诉.NET框架 这是一个适用于任何支持.NET平台的CPU的程序

而X86表示 这个程序是针对X86平台的

Any CPU非常广泛

但是 调用C++的dll就会出错

因为C++非托管程序编译时 win32 和X86都是针对X86平台的

 

 

void AsmTest();

 

要在这个函数内嵌入 汇编代码 那么过程如下

void AsmTest()
{
   __asm

   __asm
}

__asm的意思就是汇编代码开始

和结束的标识符

至于C 说实在的 我压根没区分过

C和C++重叠使用高达80%

比如结构

在C里面没有对象 只有结构

很多人在C++里面为了更简单 高效 有些特殊数据也是用结构 而不是用对象

最后NET程序的结构是 语言是最上层的,与开发者相关

写好的代码编译时被统一规范 因为 .NET有公共语言规范

也就是统一的 .NET中间代码

然后是ASP.NET 和Windows

一个针对web 一个针对Desktop

还有数据访问类  包含 Ado和XML等

最后是基础类 

最下面是CLR

CLR之后 要么是windows程序 要么是ISPAI解释程序 要么是COM和NT service

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2014-07-03 12:24  范少敏  阅读(216)  评论(0编辑  收藏  举报

导航