WEB开发网
开发学院软件开发C语言 c#编程指南(九) 平台调用P-INVOKE完全掌握,C#和C+... 阅读

c#编程指南(九) 平台调用P-INVOKE完全掌握,C#和C++互相调用

 2010-09-30 22:46:15 来源:WEB开发网   
核心提示:第一:C# 调用C++,使用P-INVOKE技术调用C++编写的动态链接库,c#编程指南(九) 平台调用P-INVOKE完全掌握,C#和C++互相调用,而动态链接库导出的一般有两种调用协议,__stdcall和_cdecl,下面展示调用两种不同调用协议的方法:C++:1int__stdcallTest1(inti)2{

第一:C# 调用C++,使用P-INVOKE技术调用C++编写的动态链接库。而动态链接库导出的一般有两种调用协议,__stdcall和_cdecl。下面展示调用两种不同调用协议的方法:

C++:

1 int __stdcall Test1(int i)
2 {
3   return printf("The __stdcall invoke convesion:%d\n", i);
4 }
5 
6  int _cdecl Test2(int i)
7 {
8   return printf("The _cdecl invoke convesion:%d\n", i);
9 }

c#:

 1     [DllImport("TestDll", CallingConvention = CallingConvention.StdCall)]
 2     public static extern int Test1(int i);
 3 
 4     [DllImport("TestDll",CallingConvention= CallingConvention.Cdecl)]
 5     public static extern int Test2(int i);
 6 
 7  public void Run()
 8 {
 9   ...
10   Test1(20);
11   Test2(30);
12   ...
13 }

第二:C#调用C++代码,也可以间接的使用C++的函数指针。(强烈建议不要使用此方法)

c++:

 1 typedef int ( __stdcall * FunctionPointerType1)(int i);
 2 typedef int ( __cdecl * FunctionPointerType2)(int i);
 3 
 4  int __stdcall Test1(int i)
 5 {
 6   return printf("The __stdcall invoke convesion:%d\n", i);
 7 }
 8 
 9  int _cdecl Test2(int i)
10 {
11   return printf("The _cdecl invoke convesion:%d\n", i);
12 }
13 
14 FunctionPointerType1 GetFunctionPointer1(int i)
15 {
16   return Test1;
17 }
18 
19 FunctionPointerType2 GetFunctionPointer2(int i)
20 {
21   return Test2;
22 }

1 2  下一页

Tags:编程 指南 平台

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接