调用非托管函数

      在.NET平台退出之前,Windows平台下就已经存在了大量的dll。这些dll中包含了可以被多个Windows应用共享的函数。很多高级语言例如C、C++、Visual Basic、Delphi等都可以创建dll。另一方面,任何一种编程语言在链接的时候,可以直接引入dll中的函数,而不管这些dll是由哪种编程语言编写的源代码编译而成的。这样就在二进制的基础上实现了代码共享。

      在.NET平台下,所有的类型定义及其实现都包装在程序集中。虽然有dll形式的程序集,但其本质跟传统的dll完全不同。dll形式的程序集和exe形式的程序集本质上都是一组包含了类型定义清单、类型实现及其引用信息的集合。两者的一个小区别是对exe形式的程序集必须指定入口,典形的入口是一个类的静态方法Main。如果源代码中定义了程序集执行入口函数,那么我们既可以将其编译成exe,也能将其编译成dll。

      .NET平台下的dll是MSIL级的。在特定平台下执行dll程序集中的函数的时候,dll程序集被翻译成特定平台下的二进制可执行代码。而传统的dll是面向特定的机器的,不存在这个翻译过程。

      从上面的讨论我们可以看出,传统dll跟.NET下的dll程序集完全不同了。为了区别,我们将传统dll称为非托管dll,将非托管dll中可以共享的函数称为非托管函数。

      .NET平台下,我们可以自如地编写托管dll,并通过添加引用的方式引入托管dll中的类型。既然如此方便,为何还要考虑在托管代码中引入非托管函数呢?首先是已经存在了大量经过时间考验的\可以被反复使用的函数,这些函数都被包装在非托管dll中。其次,通支持非托管函数调用,.NET平台保证了与以前应用的兼容。

      .NET代码以MSIL的形式存在,面向CRL;非托管dll以二进制格式存在,面向特定的机器。因此,.NET应用不能直接调用非托管函数。

概述:

      在.NET平台下,要共享其他程序集中的类型,只要简单地添加对应程序集的引用并保证该程序集能够被探测到即可。之所以如此容易,是因为.NET的程序集是自描述的。每个程序集都包含了一个详细的清单,该清单中列出了定义在程序集中的每个类型。

      在传统的非.NET平台下,就没有这么简单了。我们需要先实现需要被共享的函数,然后显示的指示编译器要将该函数引出。

原文地址:https://www.cnblogs.com/xiaocai0923/p/2174027.html