.dll文件讲解,及其调用

来源:互联网 发布:深圳入学积分怎么算法 编辑:程序博客网 时间:2024/06/07 15:25

.dll文件我目前遇到了三类,切这两类代表的意义完全不同。
一种是在c++下面,.dll文件里面是相当于机器码,叫做动态链接库,其连接方式有静态连接与动态连接。
下面是静态连接

//静态连接用到#include "stdafx.h"//关键在于加入这一句,意为将C语言下的程序导出为DLLextern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,int count){      int temp=0;      for(int i=1;i<count;i++)      {          for(int j=count-1;j>=i;j--)        {            if(p[j]>p[j-1])            {                temp=p[j];                p[j]=p[j-1];                p[j-1]=temp;            }        }      }}//调用#include<iostream>#include<time.h>using namespace std;//将export改为import即导出变导入即可extern "C"_declspec(dllimport) void maopao(int *p,int count);int main(){  int a[10];  srand(time(0));  for(int i=0;i<10;i++)      a[i]=rand()%50;  maopao(a,10);   for(int i=0;i<10;i++)       cout<<a[i]<<endl;   getchar();//为方便调试   return 0;}

下面是动态连接,到处方法是一样的

#include "stdafx.h"//关键在于加入这一句,意为将C语言下的程序导出为DLLextern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,int count){      int temp=0;      for(int i=1;i<count;i++)      {          for(int j=count-1;j>=i;j--)        {            if(p[j]>p[j-1])            {                temp=p[j];                p[j]=p[j-1];                p[j-1]=temp;            }        }      }}#include<iostream>#include<Windows.h>#include<time.h>typedef int(*Dllfun)(int *,int);using namespace std;int main(){     Dllfun maopao1;  HINSTANCE hdll;  hdll=LoadLibrary("D:\\net源码\\maopaoa_dll\\Debug\\maopaoa_dll.dll");  if(hdll==NULL)  {FreeLibrary(hdll);  }  maopao1=(Dllfun)GetProcAddress(hdll,"maopao");  if(maopao1==NULL)  {FreeLibrary(hdll);  }  int a[10];  srand(time(0));  for(int i=0;i<10;i++)      a[i]=rand()%50;  maopao1(a,10);   for(int i=0;i<10;i++)       cout<<a[i]<<endl;   FreeLibrary(hdll);}

第二种 是.dll是 AXtivex控件 ,是一种微软的共用控件的封装,比如图表,频谱控件的封装,常用于c++中,其本身也是二进制文件。
连接方式 #connect(“…”)

第三种是在c#中,叫做程序集,其运行在.net框架上,其本身没有包含机器码,需要在由.net框架转化为机器码。 其调用方法主要包括两种途径。一种是程序集引用,在vs项目管理,一种是通过反射,反射代码如下

Assembly asm= Assembly.LoadFile("路径。。"); foreach (var type in asm.GetTypes())         {           //如果是ISay接口           if (type.GetInterfaces().Contains(typeof (ISay)))           {             //创建接口类型实例             var isay = Activator.CreateInstance(type) as ISay;             if (isay != null)             {               result.Add(isay);             }           }         }  
阅读全文
0 0