C#托管代码调用C++非托管代码
1、C#调用非托管代码的方式:
2、DllImport方法调用
1)导入规则:i.方法名与Win API完全一样,设置EntryPoint属性,可以在c#中显示不同的方法名称;ii.函数除了需要DllImport类修饰符外,还需要声明public static extern类型;iii.函数返回值和参数必须和调用的API的完全一样;iv.必须引入System,Runtime.InteropServices命名空间;注:DLL的路径如果没有写,DllImport会按照以下三种顺序查找DLL:①exe所在的目 录;②system32目录;③环境变量目录;
2)DLLImport的可选属性:i.EmtryPoint:可对方法采用不同的名称,使用别名ii.CharSet:函数调用使用Unicode还是ANSIiii.ExactSpelling:False,表示让编译器自己选择使用Unicode还是ANSIiv.CallingConvention:它的参数只是入口点调用的约定;默认为CallingConvention.WinAPI;v.PreserveSig: 指示方法签名应当被保留还是被转换,当被转换时它被转换为一个具有HRESULT返回值和该返回值的一个名为retral的附加输出参数的签名,默认为truevi.SetLastError:指定是否保留上一次错误,默认为false;Eg:
[DllImport(DllName,CharSet=CharSet.Auto,EntryPoint="GetShort",CallingConvention = CallingConvention.StdCall)]public static extern int GetShortPathName();
sss
3、平台调用的原理
1)平台调用依赖于元数据在运行时查找导出的函数并封送其参数;
2)“平台调用”调用非托管函数时,它将依次执行以下操作:
i.查找包含该函数的DLL
ii.将DLL加载到内存中
iii.查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据
iv.将控制权转移给非托管函数
(注:只在第一次调用函数时,才会查找和加载DLL并查找函数在内存中的地址)
C#托管代码调用C++非托管代码相关推荐
- C#托管代码与C++非托管代码互相调用二(C++调用C#代码)
上篇文章提到,目前项目想做到核心部分代码不被反编译,而考虑到团队成员都是比较熟悉C#,因此核心算法部分采用C++,而其他地方则采用C#(例如数据访问层,界面层都使用C#语言).在上一篇文章中完成了C# ...
- C#托管代码与C++非托管代码互相调用一(C#调用C++代码.net 代码安全)
在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能 ...
- 平台调用P/INVOKE
我们在做项目时,常常要用到别的公司开发的硬件产品, 而有关对硬件产品的控制的 DEMO 又常常是用VC6.0编写的,我们如何将他们编写的DLL应用到我们现在的.net环境中些, 微软为我们提供了&q ...
- VC++ 非托管代码 托管代码
为什么80%的码农都做不了架构师?>>> #pragma managed #pragma unmanaged 看了好多好多非托管代码和托管代码之间相互调用,感觉都没有说在重点上 ...
- C#基础知识之托管代码和非托管代码
什么是托管代码(managed code) 托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行.编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方 ...
- 在 C# 中通过 P/Invoke 调用Win32 DLL
,.NET Framework 1.0 或 1.1 版类库中存在任何 Windows 所没有的功能限制都不足为怪.毕竟,32 位的 Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了 ...
- C#中调用Windows API的要点
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- C#中调用Windows API的要点【转载】
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- [收集]Visual C#中调用Windows API
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
最新文章
- 代码中配置log4j (同时输出不同级别的log到不同终端)
- [转载] 七龙珠第一部——第097话 龙争虎斗
- 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
- SQL Sever 基本命令案例
- 【R】语言第五课----画图
- Android 系统(255)---dump解码所得图片方法
- [PHP]算法- 二叉树的深度的PHP实现
- spoolqa果然是病毒!
- 32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
- Atitit 项目管理软件 在线服务 attilax总结 1. 项目管理协作的历史	1 1.1. Worktile 406k	1 1.2. Teambition 584k in baidu
- 计算经纬度距离工具类
- 蓝屏代码0x000009f
- 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量
- Pixelmator for Mac(强大的图像处理软件)
- html水平线段hr标记详解,HTML标记【水平分隔线hr标记的使用】!
- vue实现自动语音播报功能,未解决。(已用js解决20220210)
- 读书笔记——高效能人士的七个习惯3
- 关于2023年软件测试的5大趋势探讨
- 美国七大外卖O2O网站平台介绍
- linux php 压缩中文乱码,linux下zip文件解压乱码问题的解决办法分享