欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.dll文件讲解,及其调用

程序员文章站 2022-06-24 22:31:45
...

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

//静态连接用到
#include "stdafx.h"

//关键在于加入这一句,意为将C语言下的程序导出为DLL

extern "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语言下的程序导出为DLL

extern "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); 
            } 
          } 
        }