如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数

原创 2016年12月05日 13:34:58
关于DLL的含义和优点,不是本文讨论的重点,这里我们仅讨论如何用C++生成DLL文件,并导出函数。
首先:在VS中创建工程的时候,要选择VC++(我只会用C++来生成DLL文件)语言,然后选择win32再选择win32项目,如下图所示:

 

图片

 

图片

 注意,在接下来的过程中,需要选择dll.点击完成创建工程。

工程创建完成后,里面会有很多文件,打开源文件目录下的 工程名.cpp文件(其他文件都不用管)

在此文件中编写代码如下:

#include "stdafx.h"
#include<iostream>
using namespace std;
extern "C" int _declspec(dllexport)  add(int a ,int b)
{
return a+b;
}

注意上面用红体字标出的部分,这部分代码将告诉编译器此函数将作为导出函数。对于其他函数可以依此类推。点击编译按钮就编译出了dll文件。另外要说明的是,这是一种比较简单的生成dll文件的方法,不用导出函数的名称及其入口点。

至此,dll文件就已经生成了。

我们可以再任何语言中测试此dll文件。以下仅提供C++和C#语言中调用DLL中函数的方法。

在C++中,我们可以用如下方法调用DLL文件中的函数。

#include<windows.h>
#include<stdio.h>
#include<iostream>
using namespace std;

typedef int(__stdcall *fun)(int,int);//声明函数指针
int main()

{

HINSTANCE  handle = LoadLibraryA("test.dll");//加载dll文件
fun add=NULL;
add=(fun)GetProcAddress(handle,"add");//导出函数
int a,b;
cin>>a>>b;
cout<<add(a,b)<<endl;
system("pause");
return 0;

}

在C#中,调用DLL文件中的函数同样很简单。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace TEST_DLL
{
    class Program
    {
        [DllImport("test.dll", EntryPoint = "add")]
        public static extern int add(int a,int b);
        static void Main(string[] args)
        {
            int a = 108, b = 109;
            int c = add(a, b);
            Console.WriteLine(c);
            Console.Read();

        }
        
    }
}

注意,以上在加载dll文件的时候,按照我的写法,dll文件必须和可执行程序在同一目录下,否则会出现找不到dll文件的运行错误。当然,也可以应用dll文件的绝对路径。另外对于user32.dll等系统常用的dll文件,即使没有放到可执行程序的相同路径下,也没有引用其绝对路径,编译器也是能够找到此文件的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C#与C++的混合编程 之二 使用非托管dll 导出标准函数

C#与C++的混合编程 之二  使用非托管dll 导出标准函数
  • fang1192801693
  • fang1192801693
  • 2015年11月29日 12:40
  • 866

C#委托实现C++ Dll中的回调函数

很多的Dll都是C和C++写的,那么如果C#想要调用Dll中的函数怎么办,尤其是Dll函数其中一个参数是函数指针的,即里面有回掉函数的用C#怎么实现? C中的回掉函数在C#中有中特殊的处理方式叫委托...
  • ferrycooper
  • ferrycooper
  • 2017年03月18日 17:26
  • 3628

C++动态链接库导出函数或者类

1、新建一个Win32 Project,然后选择dll程序。 2、添加头文件Student.h#pragma once#ifndef _STUDENT_H_ #define _IMP_EXP_CLA...
  • hxfhq1314
  • hxfhq1314
  • 2016年11月07日 10:05
  • 2474

C++导出函数

//方式1 //extern "C" _declspec(dllexport) 调用约定 返回类型 函数名(参数列表); extern "C" { _declspec(dllexport) int p...
  • threadroc
  • threadroc
  • 2017年06月12日 17:20
  • 157

C++输入输出函数的用法(转载)

一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执...
  • fenxinzi557
  • fenxinzi557
  • 2016年08月16日 16:16
  • 3365

导出函数__declspec(dllexport)

关于DLL的函数: 动态链接库中定义有两种函数:导出函数(export   function)和内部函数(internal   function)。 导出函数可以被其它模块调用,内部函数在...
  • ooyyee11
  • ooyyee11
  • 2011年10月21日 16:53
  • 30423

DLL 的编写,导出函数

//在编程c++dll时 extern "C"和.def的作用  extern "c"是c++编译器在编译函数时以c编译器的方式处理函数名  而.def的作用也是告知编译器以.def导出的文件...
  • hanyujianke
  • hanyujianke
  • 2013年02月28日 14:35
  • 16529

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名) 第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT ex...
  • thanklife
  • thanklife
  • 2017年06月30日 09:34
  • 500

DLL库类的导出,C#的调用

在DLL库的编写中,如果想要把DLL库中写的类导出,并且在C#中进行使用,我们需要先初始化获取类的指针,然后我们可以通过指针对类进行调用,使我们能正常的使用类中的功能。  #ifdef DLL_API...
  • u012432785
  • u012432785
  • 2016年08月01日 08:59
  • 282

C# 中使用C++导出的DLL文件

摘要本篇博客主要介绍使用C++生成DLL库,并在C#工程之中进行调用。本技术可以用于Unity开发中,可以将一些复杂计算量较大的工作使用C++编写,生成DLL文件后在Unity中使用C#脚本进行调用。...
  • jcq521045349
  • jcq521045349
  • 2017年07月17日 23:52
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
举报原因:
原因补充:

(最多只允许输入30个字)