我爱Aspx >> Asp.Net >> 在 C# 中通过 P/Invoke 调用Win32 DLL为了调用 MessageBeep,您需要在 C# 中将以下代码添加到一个类或结构定义中:
[DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType);
令人惊讶的是,只需要这段代码就可以使托管代码调用非托管的 MessageBeep API。它不是一个方法调用,而是一个外部方法定义。(另外,它接近于一个来自 C 而 C# 允许的直接端口,因此以它为起点来介绍一些概念是有帮助的。)来自托管代码的可能调用如下所示:
MessageBeep(0);
请注意,现在 MessageBeep 方法被声明为 static。这是 P/Invoke 方法所要求的,因为在该 Windows API 中没有一致的实例概念。接下来,还要注意该方法被标记为 extern。这是提示编译器该方法是通过一个从 DLL 导出的函数实现的,因此不需要提供方法体。
说到缺少方法体,您是否注意到 MessageBeep 声明并没有包含一个方法体?与大多数算法由中间语言 (IL) 指令组成的托管方法不同,P/Invoke 方法只是元数据,实时 (JIT) 编译器在运行时通过它将托管代码与非托管的 DLL 函数连接起来。执行这种到非托管世界的连接所需的一个重要信息就是导出非托管方法的 DLL 的名称。这一信息是由 MessageBeep 方法声明之前的 DllImport 自定义属性提供的。在本例中,可以看到,MessageBeep 非托管 API 是由 Windows 中的 User32.dll 导出的。
到现在为止,关于调用 MessageBeep 就剩两个话题没有介绍,请回顾一下,调用的代码与以下所示代码片段非常相似:
[DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType);
Ҷƪл˵?
C# 泛型简介[05-20]
《Effective C#》 翻译札记[05-20]
C#实现WEB服务器[05-20]
C#中时间差的计算[05-20]
C#四种Eval测试结果:不要用Code..[05-20]
通常C#面试题[05-20]
用C#与XML创建动态分层菜单[05-20]
C#数值结果表(格式化字符串)[05-20]
用浏览器来接收C# 的程序返回的时..[05-20]
使用C# 编写扩展存储过程[05-20]
C# 泛型简介[05-20]
《Effective C#》 翻译札记[05-20]
Visual Studio 2005 新功能、新特..[05-20]
对mssql出现选定的用户拥有对象而..[05-20]
常用正则表达式[05-20]
将 Web 项目从 VS2002/2003 转换..[05-20]
Visual Studio 术语表[K-Z][05-20]
使用 Visual Studio 2005 Team S..[05-20]
常用CHM帮助文档集锦下载[2007-0..[05-20]
常用.NET工具下载(包括.NET可再发..[05-20]