Effecitve C# 原则46:最小化与其它非托管代码的交互
2009-02-19 08:17:24 来源:WEB开发网第二个选择是使用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方法(在开发上要开销更多的时间)。
更多精彩
赞助商链接