.net是一个平台 支持上面进行开发 主要靠.net framework支持
.net框架主要分为两部分
1.公共语言运行时(Common language runtime)----公共语言系统cls(common language system) 公共类型系统CTS(common type system)-----------编译代码语言
2.类库集fcl(一些已经写好的类)-------------
1)CTS通用类型系统(Common Type System)
CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如,用户能够在VB.NET中派生一个由C#编写的类。我们可以将CTS 看成是所有.NET 语言的superset (union),而符合CTS 的各种不同的语言,其实都只是CTS 的subset (intersection)。这些语言所写出来的程序,如果想要有最佳的相容性,以便互相调用(invoke) 或继承,这些语言之间就必需取得一个共同的subset,有共同遵守的规范,这就是CLS 。
2)CLS通用语言规范(Common Language Specification)
很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言规范(CLS:Common Language Specification),限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言如何支持继承。CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。
3)CLR公共语言运行库(Common Language Runtime)
简单地说,CLR是CTS的实现,也就是说,CLR是应用程序的执行引擎和功能齐全的类库,该类库严格按照CTS规范实现。作为程序执行引擎,CLR负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码,称为托管代码(managed code)。
.net运行的环境里面,最重要的就是操作系统(windows2000)
在面试的时候我有问道什么是CLR,CLS,CTS以及他们是用来干什么的,当然GC也有问道的,比如说什么是GC,NET是如何操作内存的,这些的问题。关于C#中如何操作内存的解释,我在网上查询了下。下面的资料来自网络。。。
GC见我的博客文章:http://blog.csdn.net/jackluangle/article/details/6607086ASP.NET中的垃圾回收机制。
C# 中如何操作内存
我们先来看看C#中如何操作内存,也就是非托管的数据。这需要引用System.Runtime.InteropServices命名空间。该命名空间下的Marshal的一些静态方法提供了这样的功能:
Marshal.ReadInt32() //从指定内存地址读取4位
Marshal.PtrToStringAnsi() //从指定内存地址读取字符串
Marshal.WriteInt32() //将整数写到指定内存地址
Marshal.WriteByte() //将字符串写到指定内存地址
我们来看看具体的代码:
using System;
using System.Text;
using System.Runtime.InteropServices;
internal sealed class RCEvent {
public int Event;
public int Flag;
public string User;
};
internal sealed class RCEventAgent {
internal static RCEvent Read(IntPtr ptr){
RCEvent Event = new RCEvent();
Event.Event = ReadEvent(ptr);
Event.Flag = ReadFlag(ptr);
Event.User = ReadUser(ptr);
return Event;
}
internal static int ReadEvent(IntPtr basePtr) {
return Marshal.ReadInt32(basePtr);
}
internal static int ReadFlag(IntPtr basePtr) {
return Marshal.ReadInt32(basePtr,4);
}
internal static string ReadUser(IntPtr basePtr) {
return Marshal.PtrToStringAnsi(new IntPtr(basePtr.ToInt32() + 8));
}
internal static void Write(ClientEvent Event,IntPtr ptr) {
WriteEvent(ptr,Event.Event);
WriteFlag(ptr,Event.Flag);
WriteUser(ptr,Event.User);
}
internal static void WriteEvent(IntPtr basePtr,int value) {
Marshal.WriteInt32(basePtr,value);
}
internal static void WriteFlag(IntPtr basePtr,int flag) {
Marshal.WriteInt32(basePtr,4,flag);
}
internal static void WriteUser(IntPtr basePtr,string user) {
WriteString(basePtr,user,8,40);
}
private static void WriteString(IntPtr basePtr,string value,int offset,int length) {
int pos = 0;
byte[] bytes = Encoding.Default.GetBytes(value);
while(pos < length) {
if (pos < bytes.Length)
Marshal.WriteByte(basePtr,offset,bytes[pos]);
else
Marshal.WriteByte(basePtr,offset,0);
pos ++;
offset ++;
}
}
}
这样我们就可以通过ReadEvent和WriteEvent直接在c#中处理该结构体。或者通过 ReadXXX() 和 WriteXXX() 直接修改其字段
。
public void DoSomething(IntPtr ptr){
RCEvent Event = RCEventAgent.Read(ptr);
Event.Flag ++;
RCEventAgent.Write(ptr, Event);
// 或者以下代码
// RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 );
}
C++中则可以直接将结构体地址传给C#:
#using <mscorlib.dll>
#using <CuteSuProc.dll>
void SomeMethod(RCEStruct* pEventStruc){
MyCSharpDll::DoSomething(pEventStruc);
}