• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#调用非托管动态库中的函数方法

C#调用非托管动态库中的函数方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#调用动态链接库,c#调用c 动态库,c#调用动态库,c#如何调用动态链接库,c#调用c 动态链接库等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程。

1、创建一个非托管动态库

代码如下:
   //这一句是声明动态库输出一个可供外不调用的函数原型. 
   extern   "C"  __declspec(dllexport)  int  add( int ,  int ); 

   int  add( int  a, int  b)  
   { 
        //实现这个函数returna+b; 
   }
</div>
注意上面代码,一定要加上 extern"C" ,不能生成的动态库中的导出函数名就不会是add,而是像 ?add@@YAHHH@Z 样子,后面只是通过函数名 add 来定位函数入口就会出问题。

保存成C或者CPP文件都可以,接下来就用命令 cl (这个命令VC6提供) 来编译生成一个动态库,命令如下:
C:\>cl /LD MyLib.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

MyLib.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:MyLib.dll
/dll
/implib:MyLib.lib
MyLib.obj
Creating library MyLib.lib and object MyLib.exp
</div>
可以看到在C盘根目录下生成了你要的动态库 MyLib.Dll ,还伴随着生成了MyLib.lib、MyLib.obj、MyLib.exp文件,上面命令cl的参数/LD就是生成动态库文件

2、编写C#程序调用动态库
   using  System; 
   using  System.Runtime.InteropServices; //这是用到DllImport时候要引入的包 
   public   class  InvokeDll{ 

       [DllImport( "MyLib.dll" , CharSet=CharSet.Auto)] 
       staticexternint add( int  a, int  b); //声明外部的标准动态库, 跟Win32API是一样. 

        public   static   void  Main() 
       { 
         Console.WriteLine(add(10,30)); 
       } 
   }
</div>
保存为InvokeDll.cs文件, 与MyLib.dll置于同一目录, 编译该文件.
C:\>csc InvokeDll.cs
Microsoft (R) Visual C# .NET 编译器版本 7.10.3052.4
用于 Microsoft (R) .NET Framework 版本 1.1.4322
版权所有 (C) Microsoft Corporation 2001-2002。保留所有权利。
将生成Invokedll.exe, 可以执行该文件.

C:\>InvokeDll
40
</div>
我们看到C#调用了非托管动态库的函数 add 。执行前保证 MyLib.dll 在能够被 InvokeDll 程序加载到的路径上。

回过头来,如果我们在MyLib.cpp中没有加上 extern"C" 在,那么C中通过函数名 add 定位不到导出方法(因为函数名在动态库中已经变了),执行invokeDll时就会出现如下错误。
C:\>InvokeDll

未处理的异常: System.EntryPointNotFoundException: 无法在 DLL MyLib.dll 中找到名为 add 的入口点。
at InvokeDll.add(Int32 a, Int32 b)
at InvokeDll.Main()
</div>
对于没有加上 extern "C" 的函数原型生成的动态库,我们就得用别的方式来调用了,具体怎么做,我现在还不知道。下面还有一个问题,上面的例子只是演示了动态库中函数非常简单的情况,如果函数传递的参数是指针,或者更复杂的数据类型,又如何操作呢?以后会深究的。

[注:]本文参考着网上一篇文章:C-Sharp调用标准动态库 ,但是直接照着原文的操作就是会无法定位 add 的入口点的错误,所以略有修改。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#编程实现动态改变配置文件信息的方法
  • C#调用非托管动态库中的函数方法

相关文章

  • 2017-05-28C#模拟MSN窗体抖动的实现代码
  • 2017-05-28C# 向二进制文件进行读写的操作方法
  • 2017-05-28C#中数据的传递以及ToolStripProgressBar
  • 2017-05-28深入委托与多播委托的详解
  • 2017-05-28c#检测文本文件编码的方法
  • 2017-05-28C#中判断、验证字符串是否为日期格式的实现代码
  • 2017-05-28c# 钩子学习笔记
  • 2017-05-28深入解析c#中枚举类型的定义与使用
  • 2017-05-28C#编程和Visual Studio使用技巧(上)
  • 2017-05-28C#实现基于IE内核的简单浏览器完整实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#设置输入法实例分析
    • C#用链式方法表达循环嵌套
    • C#使用UdpClient类进行简单通信的实例
    • C#设置自定义文件图标实现双击启动(修改注册表)
    • C# MeasureString测量字符串函数的使用方法
    • c#实现隐藏与显示任务栏的方法详解
    • C#实现给定字符串生成MD5哈希的方法
    • C#中this用法系列(二) 通过this修饰符为原始类型扩展方法
    • C#判断三角形的类型
    • C# MVC模式下商品抽奖功能实现

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有