简单了解 DLL中, .def 文件及C#调用C++方法
DLL中导出函数的声明有两种方式:
1、在函数声明中加上__declspec(dllexport)
//以下内容为 .h 文件中的内容
//向外界提供的端口
extern"C" _declspec(dllexport) int _stdcall Test1(int M, int N);
extern"C" _declspec(dllexport) int _stdcall Test2(int M, int N); //端口函数的声明
int _stdcall Test1(int M, int N);
int _stdcall Test2(int M, int N); class MyClass
{
public:
MyClass();
~MyClass();
public:
int TestFunction1(int M, int N) const; private:
double tmp = 3.1415926;
}; MyClass::MyClass()
{
} MyClass::~MyClass()
{
} int MyClass::TestFunction1(int M, int N) const
{
return M + N;
}
2、采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
;以下内容为 .def 文件中的内容
;nativeCPP : 导出 DLL 函数 这句是注释,分号为标志
;LIBRARY语句说明.def文件相应的DLL;
;EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用) LIBRARY "nativeCPP" EXPORT
Test1 @
Test2 @
使用P/Invoke直接调用native C++ Dll里面的函数。(注:此方法只能调用函数,不能调用class)。
C#调用C++导出的方法:
using System;
using System.Runtime.InteropServices; namespace ConsoleApplication_test
{
class Program
{
[DllImport(@"E:\LgsTest\C#_C++\Test_CSharpInvokeCPP_native\Debug\nativeCpp.dll", EntryPoint = "Test1",
SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
static extern int Test1(int M, int N); [DllImport(@"E:\LgsTest\C#_C++\Test_CSharpInvokeCPP_native\Debug\nativeCpp.dll", EntryPoint = "Test2",
SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
static extern int Test2(int M, int N); static void Main(string[] args)
{
int start = Environment.TickCount; //计时开始
int m = ;
int n = ;
int flag = Test1(m, n);
Console.WriteLine("END flag = {0}", flag);
Console.WriteLine(" m = n = {0}", m);
int stop = Environment.TickCount; //计时结束
Console.WriteLine("Seconds1 = {0,10}\n", (double)(stop - start) / ); int start_ = Environment.TickCount; //计时开始
int m_ = ;
int n_ = ;
int flag_ = Test2(m_, n_);
Console.WriteLine("END flag = {0}", flag_);
Console.WriteLine(" m = n = {0}", m_);
int stop_ = Environment.TickCount; //计时结束
Console.WriteLine("Seconds2 = {0,10}", (double)(stop_ - start_) / ); Console.ReadKey();
}
}
}
简单了解 DLL中, .def 文件及C#调用C++方法的更多相关文章
- 通过dll或def文件提取lib导入库文件
很多时候第三方库或其他项目提供的库多数会以动态库的形式提供dll以及相应的lib导入库.头文件,不过也有的只是提供dll和头文件,或者也提供了def模块定义(用于导出函数)文件,此时若使用将不得不调用 ...
- IIS 7 中设置文件上传大小的方法
在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...
- 文件_ _android从资源文件中读取文件流并显示的方法
======== 1 android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...
- linux中查找文件属于那个软件包的方法
一.linux中查找文件属于那个软件包的方法 [root@salt prod]# whereis htpasswdhtpasswd: /usr/bin/htpasswd /usr/share/man/ ...
- php中读取文件内容的几种方法。(file_get_contents:将文件内容读入一个字符串)
php中读取文件内容的几种方法.(file_get_contents:将文件内容读入一个字符串) 一.总结 php中读取文件内容的几种方法(file_get_contents:将文件内容读入一个字符串 ...
- windows dll的def文件
DLL(testcase_1.dll )源码:myfun.h #pragma once #ifdef TESTCASE_1_EXPORTS #define MY_API __declspec(dlle ...
- 转载:简单介绍Python中的try和finally和with方法
用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...
- 简单的反编译class文件并重新编译的方法
在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...
- MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据
之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 非常明显是能够的. 在html前台页面引用js代码例如以下 @Scripts.Render("~/ ...
随机推荐
- Excle中的使用小技巧
关于从数据库中拷贝来的数字,拷贝到excle中,那些数字都变成了科学计算法. 步骤1,鼠标右键选中的列,选择“设置单元格格式(F)” 2.从这里面选中这些是否有小数,如果没有小数就把这个改成0
- 关于delete请求,后台接收不到数据
在前端用axios需要这样写 /** * 删除数据 */export function del(url, data = {}) { return axios.delete(url, { data: q ...
- STM32F103驱动GT911
0x00 引脚连接: // SCL-------PB10 // SDA-------PB11 // INT--------PB1 // RST--------PB2 IIC的SCL与SDA需要接上拉电 ...
- JSON错误
今天遇到了json转换的错误. 原因:少导入了jar包 解决方法把所有的jar导入
- mac 配置vue+sanic环境准备工作
Vue用到npm/cnpm.webpack ,准备工作主要是将这些安装上. 首先安装这些最好使用root用户. 第一步安装npm:npm是node.js的一部分,所以需要安装node.js. 安装no ...
- JGit 切换分支
//gitDir是git仓库的根目录,这个仓库必须是已clone好了 File file = new File(gitDir); Git git = Git.open(file); //切换分支, i ...
- EL有11个隐含对象
EL有11个隐含对象: 隐含对象 类型 说明 ...
- Beautiful Soup 解析html表格
from bs4 import BeautifulSoup import urllib.request doc = urllib.request.urlopen('http://www.bkzy.or ...
- padding和margin
padding (内边距) 语法: (1)padding-left:10px; 左内边距 (2)padding-right:10px; 右内边距 (3)padding-top:10px; 上内边距 ( ...
- Hadoop HDFS 用java API 进行读写
public class HdfsApp { public static FileSystem getFileSystem() throws Exception { Configuration con ...