动态链接库(DLL)是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。可以说在windows操作系统中随处可见,打开主分区盘下的system32。在一些项目中,如果有大量运算或者涉及大量算法时通常使用C或C++语言封装成一个dll,开放一些接口供其他程序调用。

下面是写的一个简单的dll代码,主要做示例,功能非常简单

1、dll提供外部调用的方法

extern "C" _declspec(dllexport) int Max(int a,int b);
extern "C" _declspec(dllexport) int Sum(int a,int b);
extern "C" _declspec(dllexport) int Min(int a,int b);

2、方法的实现

int Max(int a,int b)
{
if(a>b)
return a;
else
return b;
} int Sum(int a,int b)
{
return a+b;
} int Min(int a,int b)
{
if(a>b)
return b;
else
return a;
}

本文主要是介绍使用C#如何调用DLL不是重点,只做简单的介绍

一、C#调用DLL

在使用C#调用C++,需要使用系统Kernel32.dll来导入dill,一般需要如下三个函数

        [DllImport("Kernel32",SetLastError=true)]
private static extern int GetProcAddress(int handle,string funcName); [DllImport("Kernel32",SetLastError=true)]
private static extern int LoadLibrary(string dllPath); [DllImport("Kernel32",SetLastError=true)]
private static extern int FreeLibrary(int handle);

其中:

LoadLibrary方法用来导入Dll

FreeLibrary方法用来释放Dll

GetProcAdress方法用来获取Dll中的方法访问的地址。

然后需要在C#中建立一个和C++中方法对应的方法,以便在C#中调用,我们定义三个委托来完成这件事:

        public delegate int Max(int a, int b);

        public delegate int Min(int a, int b);

        public delegate int Sum(int a, int b);

然后我们定义三个委托的实例,使用上面的GetProAdress方法把地址指向委托实例的地址。全部代码如下:

        private int dllHandle = ;

        public Max ProMax
{
get;
set;
} public Min ProMin
{
set;
get;
} public Sum ProSum
{
get;
set;
} // 获取dll中的接口地址
private static Delegate GetAddress(int dllModule, string functionname, Type t)
{
int addr = GetProcAddress(dllModule, functionname); if (addr == )
return null;
else
return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
} public void FreeLinbary()
{
if (this.dllHandle >= )
{
FreeLibrary(this.dllHandle);
}
} /// <summary>
/// 加载Dll
/// </summary>
/// <returns>是否加载Dll成功</returns>
public int LoadDll(string dllPath)
{
this.dllHandle = LoadLibrary(dllPath); if (this.dllHandle >= )
{
this.ProMax = (Max)GetAddress(dllHandle, "Max", typeof(Max));
this.ProMin = (Min)GetAddress(dllHandle, "Min", typeof(Min));
this.ProSum = (Sum)GetAddress(dllHandle, "Sum", typeof(Sum));
return ;
}
else
{
return ;
}
}
整个调用流程比较简单,在C#调用C++写的Dll过程中,关键是参数类型的对应方面容易出错,C++中的数据类型和C#中还是有些区别的,比如char在C#中是两个字节,在C++是一个字节。在C++中使用了指针,在C#中同样需要使用IntPtr获取其指针地址。 

C#调用C++ DLL的方式的更多相关文章

  1. C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)

    // CDLLDemo.cpp : 定义 DLL 应用程序的导出函数. // #include "stdafx.h" #include "string.h" # ...

  2. DLL调用的两种方式(IDE:VC6.0,C++)

    原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...

  3. C#调用C++ DLL动态库的两种方式

    第一种方式:C++导出函数, c#dllimport 的方式 在很多地方都看到过,如[dllimport "user32.dll"]这种代码,调用windows API,就是通过这 ...

  4. exe调用DLL的方式

    假设被调用的DLL存在一个导出函数,原型如下: void printN(int); 三种方式从DLL导入导出函数 生成DLL时使用模块定义 (.def) 文件 在主应用程序的函数定义中使用关键字__d ...

  5. 用C#调用C++DLL(x64),总是提示找不到DLL

    用C#调用自己写的C++ DLL(x64),总是提示找不到DLL,调试可以,发布release老是提示找不到DLL(dll文件确定存在) 原因:Visual C++的DLL分发方式没选:调试默认选择: ...

  6. c# 调用c++DLL方法及注意事项

    引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...

  7. C#调用C++ DLL 文件

    说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...

  8. LR调用动态链接库DLL

    什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...

  9. C#调用C++ Dll

    现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...

随机推荐

  1. PHP框架 Yii framework 用yiic命令时提示“php.exe”不是内部或外部命令

    解决方案 yii/framework/yiic.bat,修改 if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exei ...

  2. Oauth2.0(四):Implicit 授权方式

    Oauth2.0的核心机制已经总结完毕.除了核心机制,Oauth2.0 还提供了几种标准的授权流程,分别适用于不同的场景.其中一种叫做 Implicit 授权,适用于纯静态页面应用.所谓纯静态页面应用 ...

  3. POJ 1459 &amp;&amp; ZOJ 1734--Power Network【最大流dinic】

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 25108   Accepted: 13077 D ...

  4. Linux中实现多网卡绑定总结

    在Linux中实现多网卡绑定 一.原理介绍: 1.什么是bonding? Linux bonding 驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用.用于网络负载均衡及网络冗余: Li ...

  5. virtio-netdev 数据包的发送

    在前面几文中已经大体介绍了virtio的重要组成,包含virtio net设备的创建,vring的创建,与virtio设备的交互方式,我们就从网络数据包的发送角度来看下virtio的详细使用流程. [ ...

  6. C 修改命令行文本颜色

    #include <Windows.h> #include <stdio.h> int main() { HANDLE h = GetStdHandle(STD_OUTPUT_ ...

  7. 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞

    0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...

  8. linux 设置分辨率(转)

    linux 设置分辨率 如果你需要在linux上设置显示屏的分辨率,分两种情况:分辨率模式存在与分辨率模式不存在,具体如下. 1,分辨率模式已存在 1)如何查询是否存在: 图形界面:在System S ...

  9. Windows命令行参数的知识(一)

    最近没事的时候,准备研究一下Windows命令行参数的知识,因为每次自己在操作电脑时总是效率太慢,如果能够了解Windows参数的一些知识,绝对能提高效率! 基本外部命令和内部命令 首先是基本的知识, ...

  10. django初体验 学习笔记

    django环境搭建     1.安装Python     2.ipython         sudo apt-get install ipython         sudo pip instal ...