C# 互通操作 (二)基础知识1
[DllImport("user32.dll", EntryPoint = "MessageBox")]
public static extern int DebugWin(int hwnd, string content, string lpcaption, int wType);
讲解下参数的含义
EntryPoint 是指向Dll中的一个方法
当设定了EntryPoint的指向后 自己定义的方法名就不需要与dll中的方法名相同了,因为EntryPoint已经指定了。系统是以 EntryPoint指向的方法为准。
如果没有设定EntryPoint那么自己定义的方法名就必须跟dll中要调用的方法名一致才可以。
[DllImport("user32.dll", EntryPoint = "MessageBox")]
public static extern int MessageBox(int hwnd, string content, string lpcaption, int wType);
否则会报EntryPointNotFoundException的异常。
extern修饰符 加上这个修饰符是为了告诉编译器此函数是在外部实现的,同时函数必须是标记了static
dll的位置可以是相对和绝对路径 DllImport(D:\TEST.dll) DllImport(TEST1.dll) 调用约定:
CallingConvention 用于指定传递方法参数的调用约定,多数 windows平台默认值是 StdCall,而 Windows CE 默认值是Cdecl。 如果调用方与dll中使用了不同的调用约定就可能会出现无法正确调用到函数的情况。所以如果dll中指定了调用约定,使用时就要保持调用约定的一致性。 示例:
c++中的函数:
extern "C" __declspec(dllexport)
int __cdecl Test (int a, int b)
c#调用:
[DllImport("myTest.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int Test(int a, int b);
因为c++函数中明确使用了Cdecl的调用约定 所以在c#调用时就需要明确相同的调用约定,以防止无法正确调用。
先看下c#源码
namespace System.Runtime.InteropServices
{
[ComVisible(true)]
public enum CallingConvention
{
Winapi = ,
Cdecl = ,
StdCall = ,
ThisCall = ,
FastCall =
}
}
CallingConvention是个枚举我们来按照顺序讲下枚举值的含义
Winapi: 使用默认平台的调用约定,就是说使用这个值,他会根据当前不同的平台使用对应平台中的默认约定
Cdecl: 调用方负责清理堆栈
StdCall: 被调用方负责清理堆栈
ThisCall:用于调用从非托管dll导出的类中的方法
FastCall :C#不支持此值,也不支持此调用约定
C# 互通操作 (二)基础知识1的更多相关文章
- 玩耍Hibernate系列(二)--基础知识
Hibernate思维导图 Hibernate映射 关于hibernate的映射要说明的一点就是关于ID的访问权限,peroperty以及field的区别: 表的主键在内存中对应一个OID对象描述 ...
- 从壹开始 [ Id4 ] 之二║ 基础知识集合 & 项目搭建一
前言 哈喽大家又见面啦,感觉好久没更新了,这几天看了一本书<解忧杂货铺>,嗯挺好的,推荐一下
- php对文件/目录操作的基础知识(图解)
具体的如下图所示:
- shell编程技术之-基础知识
一.脚本结构 linux下shell的脚本,是将一系列命令序列写在一个文本文件,而这个文本文件时可执行的.相对命令行来说,开发效率提高.因此他的构架有2部分构成#!和命令序列.其中#!指明此脚本是用哪 ...
- 图说Oracle基础知识(一)
本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- TCP/IP协议(二)tcp/ip基础知识
今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- HTTP基础知识(二)
接着上一章的内容:HTTP基础知识(一) 二.简单的HTTP协议 1.客户端:请求访问文本或图像等资源的一端称为客户端: 服务器端:提供资源响应的一端 2.以百度为例子 这是请求头: 在起始行 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
随机推荐
- nodeJs 使用 express-http-proxy 转发请求
开发过程中经常需要用到 nodeJs做转发层 使用express配合 express-http-proxy 可以轻松的完成转发 使用过程: 安装 express-http-proxy npm inst ...
- Faiss in python and GPU报错:NotImplementedError: Wrong number or type of arguments for overloaded function 'new_GpuIndexFlatL2'.
最近在玩faiss,运行这段代码的时候报错了: res = faiss.StandardGpuResources()flat_config = 0index = faiss.GpuIndexFlatL ...
- 记一次laravel远程关联查询
如图,一个服务(service)对应一个用户(user),一个用户对应多个标签(tag),同时一个tag也可以通过中间表(pivot)对应对个用户. 现在业务需求如下:查service,这些servi ...
- groovy 知识集锦
对应官方的<Program structure>的中文翻译 http://www.cnblogs.com/zhaoxia0815/p/7404387.html
- PowerDesigner工具将表字段转成java实体
首先将数据库的表导出为SQL文件.下载安装PowerDesigner工具. 下面以图文的形式讲解: 图 (1) 图 (2) 图 (3) 图 (4) 图 (5) 图 (6) 图 ...
- 2017-11-11 Sa Oct How to open a browser in Python
2017-11-11 Sa Oct How to open a browser in Python python -m webbrowser "http://www.example.com/ ...
- python,ModuleNotFoundError,is not a package
Traceback (most recent call last): File "/home/lll/zzz/work/video/zzz/generate.py", line 7 ...
- hdu2586How far away ?-(LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:有n个点,有n-1条线连通,求两点间的最短距离,最近公共祖先的入门题.Tarjan离线算法. #in ...
- 爬虫之进阶 twisted
简介 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库.Twi ...
- spring boot + apache camel 传输文件
一 sftp搭建略 这里简单说一下为什么使用sftp.ftp和sftp各有优点,差别并不是太大.sftp安全性好,性能比ftp低.ftp对于java来说并不复杂,效率也高.之所以使用sftp主要是可以 ...