使用DLLImport进行导入函数的事. C#调用C++的函数其实不止这一种方法, 还有一种方法是用delegate申明函数委托进行调用,这种方法略显麻烦,但是可以进行回调并应用指针.

在C#中,首先先要定义一个类,用来把DLL中函数地址转换成委托:

    public class DLLWrapper{///<summary>/// API LoadLibrary///</summary>[DllImport("Kernel32")]public static extern int LoadLibrary(String funcname);///<summary>/// API GetProcAddress///</summary>[DllImport("Kernel32")]public static extern int GetProcAddress(int handle, String funcname);///<summary>/// API FreeLibrary///</summary>[DllImport("Kernel32")]public static extern int FreeLibrary(int handle);///<summary>///通过非托管函数名转换为对应的委托, by jingzhongrong///</summary>///<param name="dllModule">Get DLL handle by LoadLibrary</param>///<param name="functionName">Unmanaged function name</param>///<param name="t">ManageR type对应的委托类型</param>///<returns>委托实例,可强制转换为适当的委托类型</returns>public static Delegate GetFunctionAddress(int dllModule, string functionName, Type t){int address = GetProcAddress(dllModule, functionName);if (address == 0)return null;elsereturn Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);}///<summary>///将表示函数地址的IntPtr实例转换成对应的委托, by jingzhongrong///</summary>public static Delegate GetDelegateFromIntPtr(IntPtr address, Type t){if (address == IntPtr.Zero)return null;elsereturn Marshal.GetDelegateForFunctionPointer(address, t);}///<summary>///将表示函数地址的int转换成对应的委托,by jingzhongrong///</summary>public static Delegate GetDelegateFromIntPtr(int address, Type t){if (address == 0)return null;elsereturn Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);}}

然后, 用delegate声明函数:

    delegate void _amDBRSetThermoModel(int mid, ref int errid);

再然后, 自己写个private的函数封装DLL中的函数, hModule()函数的作用是取得DLL的地址,用在多个输出函数中

    private int hModule(){int _hModule = DLLWrapper.LoadLibrary(DLLPATH);if (_hModule == 0){return 0;}return _hModule;}private void amDBRInitialize(){try{_amDBRInitialize amf = (_amDBRInitialize)DLLWrapper.GetFunctionAddress(hModule(), "amDBRInitialize", typeof(_amDBRInitialize));amf();}catch (Exception e){throw e;}}

C#调用C++的DLL函数另一则(delegate) z相关推荐

  1. 使用C#调用非托管DLL函数

    由于工作需要,学习了GDI+编程的一些知识.其中看到了一个比较好的Demo,深入的了解后,却发现自己对如何用C#调用非托管DLL函数也有了更好的理解,于是整理了一下,跟大家一起分享. 引用: 用C#来 ...

  2. 在 C++Builder 工程里调用 DLL 函数

    调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战.在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 ...

  3. C#调用Win32 的API函数--User32.dll

    Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候我们之直接调用Win32 的API,可以很高效的实现想要的效果. using System; ...

  4. C#调用C/C++ DLL 参数传递和回调函数的总结

    原文:C#调用C/C++ DLL 参数传递和回调函数的总结 Int型传入: Dll端: extern "C" __declspec(dllexport) int Add(int a ...

  5. VC++中Depends工具的使用和DLL函数的动态调用方式示例

    VC++中Depends工具:Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(动态链接库dll),以及该exe或dll引用了这些dll中的哪些接口,同时也可以看到每个被依赖的d ...

  6. python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  7. c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  8. C#调用VC的DLL的接口函数参数类型转换一览表

    handle---------IntPtr hwnd-----------IntPtr char *----------string int * -----------ref int int & ...

  9. JNA调用DLL函数遇到的几个问题

    最近一个JSP项目需要用到分词模块,而分词模块实用C++写成的DLL库.于是上网搜各种方法,最后选择了JNA作为JSP调用DLL的工具. JNA(Java Native Access )提供一组Jav ...

最新文章

  1. 查找字符串里面有没有相同的字符- -
  2. 在微型计算机中pci指的是一种,2010新疆维吾尔自治区计算机等级考试二级理论考试试题及答案...
  3. MySQL主从复制作用和原理
  4. GitHub教程手册、使用流程
  5. 前后端整合---js对象方法---异步组件
  6. android layout 工具栏,android - 滚动时CollapsingToolbarLayout并隐藏工具栏 - SO中文参考 - www.soinside.com...
  7. 如何在 Linux 中复制文件到多个目录中
  8. 利用dropbox来Host你的silverlight应用
  9. 可以退税吗_个人所得税APP详细操作步骤来了!你成功“退税”了吗?
  10. 国产某偶像剧天才程序员爱心C语言作业用C++写的代码,结果是Py脚本文件
  11. 你应该成为公司需要的人还是成为自己想成为的人
  12. C++行为型模式-实现观察者模式
  13. java9 揭秘 jlink_使用jlink打包的java应用
  14. 7.2 一次产品异常复位引发的质量提升经历
  15. 液晶电视面板市场现状及未来发展趋势
  16. CentOS7搭建nextcloud创建私有云盘
  17. python根据excel生成报表_Python实现导出数据生成excel报表的方法示例
  18. java 编译war包_javaweb程序打包成war文件的步骤
  19. 《小岛经济学》一、前言
  20. 表格偶数奇数行颜色PHP,HTML-表格的奇数偶数行颜色不同

热门文章

  1. C# WinForm 技巧四:COMBOBOX搜索提示
  2. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....
  3. topcoder srm 706 div1
  4. Jenkins与SVN持续集成
  5. 高性能Sqlite存储模型对象解密
  6. IOS开发基础知识--碎片45
  7. ________________2058_______________后台数据不够。可能误判。
  8. imuxsock lost 353 messages from pid 20261 due to rate-limiting 解决办法
  9. xcode多target
  10. 《微软-统一沟通-UC 2013》-1-部署-基础架构-2-Add a domain controller