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++方法的更多相关文章

  1. 通过dll或def文件提取lib导入库文件

    很多时候第三方库或其他项目提供的库多数会以动态库的形式提供dll以及相应的lib导入库.头文件,不过也有的只是提供dll和头文件,或者也提供了def模块定义(用于导出函数)文件,此时若使用将不得不调用 ...

  2. IIS 7 中设置文件上传大小的方法

    在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...

  3. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  4. linux中查找文件属于那个软件包的方法

    一.linux中查找文件属于那个软件包的方法 [root@salt prod]# whereis htpasswdhtpasswd: /usr/bin/htpasswd /usr/share/man/ ...

  5. php中读取文件内容的几种方法。(file_get_contents:将文件内容读入一个字符串)

    php中读取文件内容的几种方法.(file_get_contents:将文件内容读入一个字符串) 一.总结 php中读取文件内容的几种方法(file_get_contents:将文件内容读入一个字符串 ...

  6. windows dll的def文件

    DLL(testcase_1.dll )源码:myfun.h #pragma once #ifdef TESTCASE_1_EXPORTS #define MY_API __declspec(dlle ...

  7. 转载:简单介绍Python中的try和finally和with方法

    用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...

  8. 简单的反编译class文件并重新编译的方法

    在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...

  9. MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据

    之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 非常明显是能够的. 在html前台页面引用js代码例如以下 @Scripts.Render("~/ ...

随机推荐

  1. window系统下搭建本地的NuGet Server

    1. NuGet.Config文件所在的目录: C:\Users\xxx\AppData\Roaming\NuGet 2.将nupkg为结尾的文件放在 项目的Packages目录下.(注意是和web. ...

  2. react github项目

    https://github.com/bailicangdu/react-pxq 网址;https://github.com/bailicangdu/react-pxq

  3. 排序之选择排序(SelectSort)

    package com.sort; /* * 选择排序 * 把第一位与其他数进行比较,这样每轮比较都会出现一个最大值或最小值 * 根据需要让升序或降序排列 */ public class Select ...

  4. django--orm对象关系映射之常用的增删改查

    1.查询表里所有数据 book=models.Book.objects.all() 2.条件查询 book = models.Book.objects.filter(id=1).first() # 查 ...

  5. 小程序开发-Now you can provide attr "wx:key" for a "wx:for" to improve performance

    Now you can provide attr "wx:key" for a "wx:for" to improve performance 是一个关于性能优 ...

  6. 轻量级集群管理软件-ClusterShell

    如果集群数量不多的话,选择一个轻量级的集群管理软件就显得非常有必要了.ClusterShell就是这样一种小的集群管理工具,原理是利用ssh,可以说是Linux系统下非常好用的运维工具  cluste ...

  7. 判断是否为JSON对象

    $.ajax({ type: 'POST', url: url, success(function(data){ //判断是否为JSON对象 if(typeof(data) == "obje ...

  8. Oracle创建表空间、表、一级用户授权

    ---恢复内容开始--- 1. 安装: 百度一下你就知道 2. sqlplus登录/sqlplus命令登录 在安装Oracle时,你需要记住设置的“全局数据库名”(默认为orcl) 和 口令,在以两种 ...

  9. 读取FTP 图片文件,并显示,非下载

    关于FTP,先从怎么创建开始说起,很简单,步骤就两个 ① 电脑-右键管理--本地用户组--添加用户名,密码(用于FTP的用户名.密码) ② IIS 新建FTP站点,命名,指定端口号.FTP文件路径 接 ...

  10. 大数据处理框架之Strom:DRPC

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 storm-0.9 一.DRPC DRPC:Distri ...