C#调用C++ DLL的方式
动态链接库(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的方式的更多相关文章
- C# 调用C++ dll 返回char*调用方式(StringBuilder乱码)
// CDLLDemo.cpp : 定义 DLL 应用程序的导出函数. // #include "stdafx.h" #include "string.h" # ...
- DLL调用的两种方式(IDE:VC6.0,C++)
原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...
- C#调用C++ DLL动态库的两种方式
第一种方式:C++导出函数, c#dllimport 的方式 在很多地方都看到过,如[dllimport "user32.dll"]这种代码,调用windows API,就是通过这 ...
- exe调用DLL的方式
假设被调用的DLL存在一个导出函数,原型如下: void printN(int); 三种方式从DLL导入导出函数 生成DLL时使用模块定义 (.def) 文件 在主应用程序的函数定义中使用关键字__d ...
- 用C#调用C++DLL(x64),总是提示找不到DLL
用C#调用自己写的C++ DLL(x64),总是提示找不到DLL,调试可以,发布release老是提示找不到DLL(dll文件确定存在) 原因:Visual C++的DLL分发方式没选:调试默认选择: ...
- c# 调用c++DLL方法及注意事项
引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...
- C#调用C++ DLL 文件
说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...
- LR调用动态链接库DLL
什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...
- C#调用C++ Dll
现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...
随机推荐
- [Scikit-learn] 2.5 Dimensionality reduction - ICA
理论学习: 独立成分分析ICA历史 Ref: Lecture 15 | Machine Learning (Stanford) - NG From: https://wenku.baidu.com/v ...
- Java把数字格式化为货币字符串
数字可以标志货币.百分比.积分和电话号码等,就货币而言,在不同的国家会以不同的格式来定义,本实例将接收用户输入的数字,然后在控制台中输出其货币格式,其中使用了不同国家的货币格式. 思路如下:使用Num ...
- 解决Android 6.0(api 23) SDK,不再提供org.apache.http.*
Eclipse 解决办法 libs中加入 org.apache.http.legacy.jar 上面的jar包在:**\android-sdk\platforms\android-23\optiona ...
- 用XYNTService把Python程序变为服务
1. XYNTService的使用 1.1. 介绍 1.2. XYNTService 2. 用XYNTService把Python程序变为服务 1. XYNTService的使用 1.1. 介绍 通常 ...
- vue中使用mockjs
第一步安装mockjs:npm i mockjs -S 在src目录下新建mock文件夹,文件夹添加test.js test.js内容如下: import Mock from 'mockjs'; co ...
- ios开发之--搜索框的使用(PYSearchViewController的使用)
最近需要开发搜索框,比较了以前的各个版本的搜索框,UISearchDisplayController和UISearchController的使用,以后再做记录,随着ios11的更新,一些控件发生了,改 ...
- PowerDesigner导出word,PowerDesigner把表导出到word,PDM导出word文档
PowerDesigner导出word,PowerDesigner把表导出到word,PDM导出word文档 >>>>>>>>>>>& ...
- Linux最大打开文件描述符数
1. 系统最大打开文件描述符数:/proc/sys/fs/file-max a. 查看 $ cat /proc/sys/fs/file-max 186405 2. 设置 a. 临时性 ...
- VS2015编译提示无法运行“rc.exe”
使用VSx64命令行编译项目,提示无法运行“rc.exe” 想办法搜索rc.exe和rcdll.dll这两个文件,然后拷贝到C:\Program Files (x86)\Microsoft Visua ...
- LINUX安装中文输入法和那些大坑
明明有很多事要做,却偏偏不知道要做什么,这种感觉,很令人上火. 一.基础知识 在原生ubuntu14.04英文环境系统中只有IBus拼音,真的好难用.由于搜狗输入法确实比Linux系统下其它的中文输入 ...