Ambow--C#基础笔记(20110726)

  

.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);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值