WEB开发网
开发学院软件开发C语言 Effecitve C# 原则46:最小化与其它非托管代码的交... 阅读

Effecitve C# 原则46:最小化与其它非托管代码的交互

 2009-02-19 08:17:24 来源:WEB开发网   
核心提示: 第二个选择是使用P/Invoke,这是一个更高效的方法来调用Win32的API,Effecitve C# 原则46:最小化与其它非托管代码的交互(5),因为你避免了在上层与COM打交道,而坏消息是,你很快就明白这不是一个高产的方法来提供交互功能,简单的说,你须要为你使用的每个P/Invok

第二个选择是使用P/Invoke。这是一个更高效的方法来调用Win32的API,因为你避免了在上层与COM打交道。而坏消息是,你须要为你使用的每个P/Invoke方法手写这些接口。越是调用多的方法,越是多的申明必须手写。这种P/Invoke申明就是告诉CRL如何访问本地方法。这里额外的解释一下为什么每个一个关于P/Invoke的例子里(也包括下面这个)都使用MessageBox:

public class PInvokeMsgBox
{
  [ DllImport( "user32.dll" ) ]
  public static extern int MessageBoxA(
   int h, string m, string c, int type );
  public static int Main()
  {
   return MessageBoxA( 0,
    "P/InvokeTest",
    "It is using Interop", 0 );
  }
}

另一个使用P/Invoke的主要缺点是,这并不是设计成面向对象的语言。如果你须要导入C++库,你必须在你的导入申明中指明封装名。假设取代Win32的MessageBox API,你想访问MFC的C++DLL里的另外两个AfxMessageBox 方法。你须要为其中一个方法创建一个P/Invoke申明:

?AfxMessageBox@@YGHIII@Z

?AfxMessageBox@@YGHPBDII@Z

这两个申明名是与下面的两个方法匹配的:

int AfxMessageBox( LPCTSTR lpszText,
 UINT nType, UINT nIDHelp );
int AFXAPI AfxMessageBox( UINT nIDPrompt,
 UINT nType, UINT nIDHelp);

即使是在重写少数几个方法之后,你很快就明白这不是一个高产的方法来提供交互功能。简单的说,使用P/Invoke只能访问C风格的Win32方法(在开发上要开销更多的时间)。

上一页  1 2 3 4 5 6  下一页

Tags:Effecitve 原则 最小化

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