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. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(一)

    前段时间面试被问到了数据库方面的知识:比如选择什么样的数据库,如何优化,怎么加索引,于是想到了自己动手测试一下常用数据库的性能: 第一步,下载好JMeter之后打开运行.话说这个JMeter打开还真是 ...

  2. Click One客户端安装后将安装目录删除,再从服务器下载安装无法安装解决办法

    报错信息: 平台版本信息 Windows : 6.1.7601.65536 (Win32NT) Common Language Runtime : 4.0.30319.42000 System.Dep ...

  3. 微信网页浏览器打开链接后跳转到其他浏览器下载APK文件包

    做微信营销活动或者APK下载推广时候,是无法直接下载,做到微信中正常使用呢?这就要借助一些工具来实现有效的操作. 安卓手机的话是通过点击链接,直接跳转出微信.自动打开手机默认的浏览器.但是这个方法IO ...

  4. servlet中如何实现通过Spring实现对象的注入

    @WebServlet("/BaseServlet")public class BaseServlet extends HttpServlet { private static f ...

  5. Web应用启动时,后台自动启动一个线程(转)

    原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html Web应用启动时,后台自动启动一个线程 (1)前言 前几天,manager问道一个问题: ...

  6. java结合node.js非对称加密,实现密文登录传参——让前后端分离的项目更安全

    前言   在参考互联网大厂的登录.订单.提现这类对安全性操作要求较高的场景操作时发现,传输的都是密文.而为了目前项目安全,我自己负责的项目也需要这方面的技术.由于,我当前的项目是使用了前后端分离技术, ...

  7. Django的admin管理系统写入中文出错的解决方法/1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘locate’

    Django的admin管理系统写入中文出错的解决方法 解决错误: 1267  Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and ( ...

  8. polyfillJS生成promise对象

    https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js

  9. vue获得当前页面URL动态拼接URL复制邀请链接方法

    vue获得当前页面URL动态拼接URL复制邀请链接方法 当前页面完整url可以用 location.href路由路径可以用 this.$route.path路由路径参数 this.$route.par ...

  10. jenkins+git+maven

    这个有参考:https://blog.csdn.net/xlgen157387/article/details/50353317 主要针对一些错误记录一下 1.如果要不想用系统的jdk等,可以在全局工 ...