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++非托管代码相关推荐

  1. C#托管代码与C++非托管代码互相调用二(C++调用C#代码)

    上篇文章提到,目前项目想做到核心部分代码不被反编译,而考虑到团队成员都是比较熟悉C#,因此核心算法部分采用C++,而其他地方则采用C#(例如数据访问层,界面层都使用C#语言).在上一篇文章中完成了C# ...

  2. C#托管代码与C++非托管代码互相调用一(C#调用C++代码.net 代码安全)

    在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能 ...

  3. 平台调用P/INVOKE

    我们在做项目时,常常要用到别的公司开发的硬件产品,  而有关对硬件产品的控制的 DEMO 又常常是用VC6.0编写的,我们如何将他们编写的DLL应用到我们现在的.net环境中些, 微软为我们提供了&q ...

  4. VC++ 非托管代码 托管代码

    为什么80%的码农都做不了架构师?>>>    #pragma managed #pragma unmanaged 看了好多好多非托管代码和托管代码之间相互调用,感觉都没有说在重点上 ...

  5. C#基础知识之托管代码和非托管代码

    什么是托管代码(managed code) 托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行.编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方 ...

  6. 在 C# 中通过 P/Invoke 调用Win32 DLL

    ,.NET Framework 1.0 或 1.1 版类库中存在任何 Windows 所没有的功能限制都不足为怪.毕竟,32 位的 Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了 ...

  7. C#中调用Windows API的要点

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  8. C#中调用Windows API的要点【转载】

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  9. [收集]Visual C#中调用Windows API

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

最新文章

  1. 代码中配置log4j (同时输出不同级别的log到不同终端)
  2. [转载] 七龙珠第一部——第097话 龙争虎斗
  3. 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
  4. SQL Sever 基本命令案例
  5. 【R】语言第五课----画图
  6. Android 系统(255)---dump解码所得图片方法
  7. [PHP]算法- 二叉树的深度的PHP实现
  8. spoolqa果然是病毒!
  9. 32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
  10. Atitit 项目管理软件 在线服务 attilax总结 1. 项目管理协作的历史 1 1.1. Worktile 406k 1 1.2. Teambition  584k in baidu
  11. 计算经纬度距离工具类
  12. 蓝屏代码0x000009f
  13. 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量
  14. Pixelmator for Mac(强大的图像处理软件)
  15. html水平线段hr标记详解,HTML标记【水平分隔线hr标记的使用】!
  16. vue实现自动语音播报功能,未解决。(已用js解决20220210)
  17. 读书笔记——高效能人士的七个习惯3
  18. 关于2023年软件测试的5大趋势探讨
  19. 美国七大外卖O2O网站平台介绍
  20. linux php 压缩中文乱码,linux下zip文件解压乱码问题的解决办法分享

热门文章

  1. 关于“数组指针”的一点想法
  2. Ext JS 3.2.0发布(转)
  3. [HTTP] Cookie
  4. javascript设计模式-singleton(单例)模式
  5. 18. 四数之和(四指针,快排)
  6. EasyPR车牌识别学习总结
  7. 基于Mind+的NB-IOT自动获取时间和位置
  8. 汉堡王什么汉堡好吃_如何制作汉堡的汉堡胚?做汉堡胚需要注意什么?
  9. C语言------实现抢21根火柴的小游戏
  10. 软件工程第二次作业(原型设计)