未托管资源-平台调用(P/Invoke)




所谓非托管资源是你通过P/Invoke之类方法得到的os资源,CLR没有办法帮你释放这些资源。如果你对这些资源提供了包装WrapSource。那么这个WrapSource是托管资源了.他可能管理了非托管资源。但他自己是托管的。



#中的API就是Win32API,即平台调用(P/Invoke),一种调用非托管的DLL中函数的.net特性。
Windows API 是作为 Windows 操作系统一部分的动态链接库 (DLL)。当难以自己编写等效的过程时,可以使用它们来执行任务。在代码中使用 Windows API 的好处在于它们可以节省开发时间,因为它们包含许多已经编写好的、等待使用的有用函数。缺点是在发生故障时,Windows API 可能难以处理并且不可挽回。
Windows API 表示一种特殊类别的互操作性。Windows API 不使用托管代码,不具备内置类型库,它使用的数据类型与 Visual Studio 中所用的数据类型不同。由于这些差别,且 Windows API 不是 COM 对象,所以与 Windows API 和 .NET Framework 的互操作是通过使用平台调用 (PInvoke) 来完成的。平台调用是一种服务,它使托管代码能够调用 DLL 中实现的非托管函数。
为了从托管代码中调用非托管的DLL中函数,你要创建一个P/Invoke包装(Wrapper)。一个P/Invoke包装是一个.net兼 容的方法声明,用来创建P/Invoke包装的语法与创建托管方法的声明语法本质上是一样的。唯一不同是P/Invoke包装不包含函数体,而只有方法 名、返回值类型和参数信息。并且,P/Invoke包装使用了DllImport属性。这个属性是用来定位包含有目标函数的非托管的DLL。
例如:
MessageBox在win32的头文件中的声明:
int WINAPI MessageBoxA(HWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);
那么我们要在C#中调用这个MessageBox时要这样声明:
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, String text,
String caption, uint type);
}
然后可以用常规的.net方法去调用这个MessageBox:
public class HelloWorld {
public static void Main() {
Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
}
}

你可能感兴趣的:(平台,windows,api,dll,.net,winapi,.Net,Framework)