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语言保留特殊含义或者 ...
随机推荐
- kettle删除移动文件
- 一个suse11 sp1的crash工具版本问题
这几年排查的各种类型的crash也比较多了,各种类型的也算见过,但是排查这个crash,走了不该走的弯路,事后显得很low,为了防止自己犯类似错误,也同时提醒后人,记录之. 内核是suse11,sp1 ...
- Vue打包报错Unexpected token: punc(()解决方案
(用vscode)vue项目打包时,报错,报错信息如下: ERROR in static/js/0.564c764efc3ecf31190c.js from UglifyJs Unexpected t ...
- whereis命令详解
1.简介: whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis ...
- jquery中的globalEval()源码分析
//20170724 huanhua 定义成全局的变量 // 在谷歌浏览器下运行的: // function fun(){ eval('var a=1'); } 此时 定义的 a 就是局部的变量 // ...
- RabbitMQ消费者抛异常日志持续打印的问题
场景 消费者接受消息,进行一系列处理,但是由于某些原因处理过程中该消费者的抛出了异常,并且不捕获(直接 throws IOException 抛出去): 由于抛出了IOException,那么这条消息 ...
- 深入理解C++11【3】
[深入理解C++11[3]] 1.POD类型 Plain Old Data. Plain 表示 了POD是个普通的类型.C++11将POD划分为两个基本概念的合集: 1)平凡的(trivial) 2) ...
- EOS源码
[EOS源码] 1.在 libraries/chain/include/eosio/chain/ 目录下. permission_level 定义如下: account_name.permissi ...
- React Native的学习资源网址
react官方文档(英文): https://facebook.github.io/react/docs/getting-started.html react中文社区(内部有视频教程等): htt ...
- Gulp教程之:Gulp能做什么,前端装逼为何要用它
我们先说说 平时web开发遇到的一些场景 和 苦恼无奈的情况: JavaScript和CSS的版本问题 我们都知道 JavaScript和CSS属于静态文件,如果地址不变,浏览器会缓存这些文件,那就意 ...