.NET简谈互操作(六:基础知识之提升平台调用性能)
来源:深度训练(DotNet专场) 责任编辑:栏目编辑 发表时间:2013-07-01 12:29 点击:次
互操作系列文章:
.NET简谈互操作(一:开篇介绍)
.NET简谈互操作(二:先睹为快)
.NET简谈互操作(三:基础知识之DllImport特性)
.NET简谈互操作(四:基础知识之Dispose非托管内存)
.NET简谈互操作(五:基础知识之Dynamic平台调用)
.NET简谈互操作(六:基础知识之提升平台调用性能)
.NET简谈互操作(七:数据封送之介绍)
我们继续.NET互操作学习。本篇文章我们将来学习互操作基础知识中的最后一个知识点“提升平台调用的性能”;
在于非托管函数进行互操作的过程中,由于涉及的技术因数众多,因此程序的性能会受到这些因素的影响导致性能下降,本篇文章将来介绍在平台调用过程中提升性能的一些设计和编码方面的技巧;[王清培版权所有,转载请给出署名]
一:显示的制定要调用的非托管函数名称
我们在进行平台调用的时候,如果CLR无法在非托管DLL中找到与DllImport特性指定的函数名相同的非托管函数,那么CLR会尝试采用一些规则重新进行搜索。比如我们将sumA非托管函数的CharSet申明为CharSet.Ansi,那么CLR首先会通过根函数名(sum)进行搜索,如果在指定的非托管DLL中找到了此函数,就是用它。如果不能找到,就会使用带后缀A的函数(sumA)进行搜索。其实为什么会出现这种情况,原因来自于字符编码的不同,有的函数实现是采用Ansi方式,有的采用Unicode方式,这两种编码方式的不同最终导致数据在内存的存放也不同,所以在进行非托管调用的时候,我们需要注意;
非托管代码:
- extern "C" _declspec(dllexport) int _stdcall addA(int x,int y)
- {
- return x+y;
- }
托管代码申明1:
- [DllImport("Win32DLL.dll",EntryPoint = "add", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
- public static extern int add(int x, int y);
托管代码申明2:
- [DllImport("Win32DLL.dll",EntryPoint = "addA", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall,ExactSpelling=true)]
- public static extern int add(int x, int y);
上面两段托管代码申明有些细微的不同的,第一个托管代码是我们常见的申明方式,而第二个是我们少见的申明,两种不同的申明方式对CLR的平台调用来说是不一样的
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>