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语言保留特殊含义或者 ...
随机推荐
- Linux 打包压缩与搜索命令
1.tar 用于对文件进行打包压缩或解压,格式为tar[选项][文件],-f参数必须放到参数最后一位 tar -czvf etc.tar.gz /etc tar参数及作用 参数 作用 -c 创建压缩文 ...
- cept源代码目录结构详解_知识树(转)
1 简介该代码架构基于版本10.0.5整理,先整理根目录里的代码,再整理出src目录的架构. 2 代码架构2.1 Ceph源码根目录Ceph的根目录下包含了一些文件夹和若干编译.代码格式相关的文件. ...
- linux命令行下xlsx转换成pdf或csv的笔记
使用libreoffice(可以用yum直接安装,占用了4xxM磁盘空间...) 然后命令行执行: 转换成csv,支持utf-8中文编码: libreoffice --invisible --con ...
- [Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程
大家知道 Swoole 提供了方便于服务器.网络编程的模式,简化了多进程编程. 这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升. 但是这一切还没有让人足够兴 ...
- Win7 Win8 Win10取不到机器码的处理办法
1.更改UAC也就是用户账户的控制权限 2.以管理员身份运行软件
- GIS 案例教程-蜂窝多边形制作模型
GIS 案例教程-蜂窝多边形制作模型 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 优点: 拖放式,非编程,复制即用,不用配置. 效率高,非迭代,可以处理大数据. ...
- 学习TestNG,乍暖还寒冷时
时间:2019年2月23日,农历正月十九,星期六,天气晴,略有阳光,但下午三点多就不见阳光了. 地点:上海 昨夜雨疏风骤,浓睡不消残酒.试问卷帘人,却道海棠依旧.知否?知否?应是绿肥红瘦 是的,魔都上 ...
- GitHub下载提速
通过修改hosts文件来提速(该方法也可加速其他因为CDN被屏蔽导致访问慢的网站) 第一步:获取GitHub的IP地址 通过访问:http://tool.chinaz.com/dns或者https:/ ...
- Vue和后台交互的方式
1 vue-resource https://segmentfault.com/a/1190000007087934 2 axios 3 ajax
- BurpSuite抓HTTPS包
Burp Suite要抓HTTPS的包的话,是需要有Burp Suite的CA证书的 为什么要证书这里就不说了,下面是具体步骤 1.首先要把Burp Suite的CA证书下载到本地 Burp Suit ...