如何生成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#直接调用DLL导出函数

示例 1 本示例显示如何使用 DllImport 属性通过调用 msvcrt.dll 中的 puts 输出消息。 // PInvokeTest.cs using System; using S...

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

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

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

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

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

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

C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法

本篇文章为了熟悉在C#环境下如何调用C(C++)写的dl
  • cumtwys
  • cumtwys
  • 2014年07月30日 23:43
  • 1891

如何在VS2010中生成dll和查看已有的dll中的函数

(1)生成自己类库DLL文件 打开VS2010,新建-项目-Windows-类库(),用于创建C#类库的项目(dll)。 按照正常编写类的方法封装一个自定义的类库类,写好后,可以再添加一个普通的测...

DLL的Dllmain函数讲解

1  DLL的进入/退出函数 1.1  DllMain简介 跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。以“DllMain”为关键字,来看看MSDN...

创建和使用动态链接库 (C++)

此分步演练演示如何创建用于 C++ 应用的动态链接库 (DLL)。 使用库是重复使用代码的一种绝佳方式。 与其在创建的每个程序中重新实现相同的例程,不如一次性编写它们,然后从需要该功能的应用中引用它们...
  • tkp2014
  • tkp2014
  • 2015年07月12日 10:30
  • 324

C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)

一:首先什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥...

C#中调用C++的dll的参数为指针类型的导出函数

C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)          严格来说这篇文章算不上C++范围的,不过还是挂了点边,还是在自己的blog中记录一下吧。      ...
  • jjjfox
  • jjjfox
  • 2011年08月12日 14:07
  • 614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
举报原因:
原因补充:

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