托管和非托管的问题

来源:互联网 发布:骚男淘宝店 编辑:程序博客网 时间:2024/04/29 23:12

    以前使用VC 6.0写程序的时候,我做过这样一个程序,模拟操作系统的LRU和FIFO算法。当时为了模拟进入内存缓冲区的数据,使用时间(Time.h)来实现随机产生数字的函数。为了导入时间(.dll)的使用,感觉很麻烦,而且到现在为止我都不太清楚其内部的机制到底是怎么走的。

    在我看来,似乎先学会用,搞明白它是个什么东西,总比什么都不懂的去看那些繁冗的文字理论强。

    接触visual studio.net之后,我发现它对这方面的处理有了很大的进步,让开发者感觉导入.dll十分方便。

    .NET框架本身提供了这样一种服务,允许受管辖的代码调用动态链接库中实现的非受管辖函数,包括操作系统提供的Windows API函数。它能够定位和调用输出函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。

    下面是一个调用API函数的例子:
    [DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,
    CharSet=CharSet.Unicode, ExactSpelling=true,
    CallingConvention=CallingConvention.StdCall)]
    public static extern bool MoveFile(String src, String dst);

 其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助.

原创粉丝点击