C#程序调用非托管C DLL文件的方法
2010-10-01 00:00
633 查看
C++中的函数声明
通常来说,C++编译器可能会改变函数和变量的名字,从而导致严重的链接程序问题。例如,假设使用C++编写一个DLL,当创建DLL时,Microsoft的编译器就会改变函数的名字。函数名将被设置一个前导下划线,再加上一个@符号的前缀,后随一个数字,表示作为参数传递给函数的字节数。例如,下面的函数是作为DLL的输出节中的_MyFunc@8输出的:
使用extern“C”关键字可以使编译器按照C语言的方式编译DLL文件,即编译时不改变函数名。
__declspec(dllexport)
在32位编译器版本中,可以使用__declspec(dllexport)关键字从DLL导出数据、函数、类或类成员函数。__declspec(dllexport)会将导出指令添加到对象文件中,因此不需要使用.def文件。
若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:
表明被调用方清理堆栈。
C#中的函数声明
System.Runtime.InteropServices命名空间提供各种各样支持COMinterop及平台调用服务的成员,使程序可以与非托管代码进行交互操作。
[DllImport(“dllfilepath”)]
代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中。在声明的时候还可以添加几个属性:
CharSet:控制名称重整和封送String参数的方式(默认是UNICODE)
CallingConvention指示入口点的函数调用约定(默认WINAPI)
注意:必须在标记为”static”和”extern”的方法上指定”DllImport”属性。
数据传递方法
1.基本数据类型的传递
函数参数和返回值可以是C#和C++的各种基本数据类型,如int,float,double,char(注意不是char*)等。示例:
C#代码:
2.向DLL传入字符串
C#中使用string定义字符串,将字符串对象名传给DLL。注意:在DLL中更改字符串的值,C#中的值也会改变。
缺点:无法改变字符串的长度,建议使用第3种方法。
C#代码:
3.DLL传出字符串
C#中使用StringBuilder对象创建变长数组,并设置StringBuilder的Capacity为数组最大长度。将此对象名传递给DLL,使用char*接收。C#代码:
4.DLL传递结构体(需要在C#中重新定义,不推荐使用)
C#中使用StructLayout重新定义需要使用的结构体。注意:在DLL改变结构体成员的值,C#中随之改变。
C#代码:
相关文章推荐
- C#实现Web程序调用Windows程序的方法
- 关于C#如何动态加载程序并调用其中某个类的方法
- C#调用dll提示"试图加载格式不正确的程序"解决方法
- C#客户端程序调用外部程序的3种实现方法
- c#调用外部程序方法
- 黄聪:将C#程序嵌入资源中(C# 调用嵌入资源的EXE文件方法)
- C#中调用DLL时未能加载文件或程序集错误处理方法
- C#调用dll提示"试图加载格式不正确的程序"解决方法
- c# 一般处理程序调用js方法
- 浅谈C++调用C#的DLL程序方法_________转自:http://developer.51cto.com/art/201104/254308.htm
- C#调用dll提示"试图加载格式不正确的程序"解决方法
- 将C#程序嵌入资源中(C# 调用嵌入资源的EXE文件方法)
- C#调用Exe文件的方法及如何判断程序调用的exe已结束
- 编写高质量代码改善C#程序的157个建议——建议48:Dispose方法应允许被多次调用
- C#调用exe文件,IIS发布后无法掉用本地exe程序的解决方法
- C#对于C++程序方法的调用
- c# 反射调用程序集方法、接口实例
- C# 调用其它程序 Process.Start 方法说明
- C#动态方法调用 提高程序的扩展性
- 从C#程序中调用非受管DLLs的方法