c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL

总结点

c++动态库调用另一个动态库

c++动态库调用c动态库

c#等其他语言调用c/c++动态库

IDE

vs2010及以上

c++动态库调用另一个动态库

a动态库调用另一个动态库b,主要由2种方式,

在头文件中声明

__declspec(dllexport)

def文件

利用.def文件新建此DLL(模块)的导出接口,例如:
EXPORTS必须为大写

LIBRARY 
EXPORTS
   add @1
   mul @2

关于.def的详细说明,请参考msdn文档;
https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx

两种方式比较

关于两者的优点和缺点,请参考文章:

http://www.cnblogs.com/TianFang/archive/2013/05/04/3059073.html

总的来说,def优点大于每个接口前声明__declspec(export) 这种方法。

例子

DLL a 的结构如下所示:

c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL_第1张图片

DLL b 的结构如下所示:

c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL_第2张图片

代码分别为:

DLL a

#include "../circle/iadd.h"
#include "../circle/imul.h"
#include "../cgrid/csize.h"
#pragma  comment(lib,"circle.lib")
#pragma  comment(lib,"cgrid.lib")

void main()
{   
    int c = add(1,2);
    c *= mul(3,4);
    double cnt = calcnt(10,2);
}

DLL b

iadd.h 头文件:

#ifndef IADD_H
#define IADD_H
int __stdcall add(int,int); //__stdcall: add can be used by other languages,C#,Java...
#endif 

imul.h 头文件:

#ifndef IMUL_H
#define IMUL_H
int __stdcall mul(int,int); //__stdcall: mul can be used by other languages,C#,Java...
#endif 

iadd.cpp:

#include "iadd.h"

int __stdcall add(int a, int b)
{
    return a+b;
}

imul.cpp:

#include "imul.h"

int __stdcall mul(int a, int b)
{
    return a*b;
}

interface.def:

LIBRARY 
EXPORTS
   add @1
   mul @2

手动配置lib, dll输出路径

为了统一管理,将lib(a链接b要用到), dll(启动a, 运行程序时要用到b),设置生成这两个文件的路径都在 bin 下:

设置DLL a 的输出路径:
c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL_第3张图片

设置DLL a 引用的DLL b的 Lib文件(链接时用到)的链接路径:

c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL_第4张图片

设置DLL b 的输出路径:

c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL_第5张图片

此时的整个文件结构如下如所示:

c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL_第6张图片

以上完成后,DLL a main方法就可以调用 b的接口了。

c++动态库调用c动态库

请参考文章:针对动态加载方式的C/C++动态链接库编写(http://www.cnblogs.com/ycloneal/p/5722928.html)
这里面做了详细的介绍,关键一点 在头文件中声明调用方式为__stdcall,具体格式如下(必须按照这个格式)

#ifdef __cplusplus
extern "C"{
  double __stdcall calcnt(double area, double boxarea);
}
#endif

c#等其他语言调用c/c++动态库

具体文章请参考 : C#调用C++动态库(dll)
http://www.cnblogs.com/hongmaju/p/4727173.html

总而言之,刚才提到的__stdcall正是可以让其他语言C#, JAVA等可以调用C++DLL的前提。

具体代码:

 class Program
    {
        [DllImport("circle.dll", CallingConvention = CallingConvention.Winapi)] //c++
        public static extern int add(int a, int b);

        [DllImport("cgrid.dll", CallingConvention = CallingConvention.Winapi)] //c
        public static extern double calcnt(double area, double boxarea);

        static void Main(string[] args)
        {
            int sum = add(1, 3);
            double cnt = calcnt(100, 2);
        }
    }

源码下载

http://download.csdn.net/detail/daigualu/9926444

你可能感兴趣的:(C,.NET基础,软件工程,.NET开发,c,c++,c#,dll,调用)