在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
引用: 用C#来捕获屏幕的源程序代码(Capture.cs)
#endregion
上面的例子中,应用C#调用非托管DLL的函数如下:
//声明一个API函数
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ] private static extern bool BitBlt ( IntPtr hdcDest , // 目标 DC的句柄 int nXDest , int nYDest , int nWidth , int nHeight , IntPtr hdcSrc , // 源DC的句柄 int nXSrc , int nYSrc , System.Int32 dwRop // 光栅的处理数值 ) ;
System.Runtime.InteropServices.DllImportAttribute
using System.Runtime.InteropServices;
[DllImport("user32.dll")] public static extern int MessageBox(int hWnd, String text, String caption, uint type); 示例2 如何将 DllImportAttribute 应用于方法。
using System.Runtime.InteropServices;
[DllImport( "KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall ) ] public static extern bool MoveFile(String src, String dst); 参数说明: EntryPoint 指定要调用的 DLL 入口点。 BestFitMapping 是否启用最佳映射功能,默认为 true。 PreserveSig 托管方法签名是否转换成返回 HRESULT,默认值为 true(不应转换签名)。
public static extern int MyMethod(int x); 若将 abstract 和 extern 修饰符一起使用来修改同一成员是错误的。extern 将方法在 C# 代码的外部实现,而 abstract 意味着在此类中未提供此方法的实现。 因为外部方法声明不提供具体实现,所以没有方法体; 示例3 接收用户输入的字符串并显示在消息框中 程序从 User32.dll 库导入的 MessageBox 方法。
using System;
using System.Runtime.InteropServices; class MyClass { [DllImport("User32.dll")] public static extern int MessageBox(int h, string m, string c, int type); public static int Main() { string myString; Console.Write("Enter your message: "); myString = Console.ReadLine(); return MessageBox(0, myString, "My Message Box", 0); } } 运行结果: 输入"Hello"文本后,屏幕上将弹出一个包含该文本的消息框。 该示例使用两个文件 CM.cs 和 Cmdll.c 来说明 extern。 使用 Visual C++ 命令行将 Cmdll.c 编译为 DLL: 文件:Cmdll.c
// cmdll.c
// compile with: /LD /MD int __declspec(dllexport) MyMethod(int i) { return i*10; }
// cm.cs
using System; using System.Runtime.InteropServices; public class MyClass { [DllImport("Cmdll.dll")] public static extern int MyMethod(int x); public static void Main() { Console.WriteLine("MyMethod() returns {0}.", MyMethod(5)); } } 运行此程序,MyMethod 将值 5 传递到 DLL 文件,该文件将此值乘以 10 返回。 对于平台调用,应让参数为 IntPtr 类型,而不是 String 类型。使用 System.Runtime.InteropServices.Marshal 类所提供的方法,可将类型手动转换为字符串并手动将其释放。 IntPtr 类型被设计成整数,其大小适用于特定平台。 IntPtr 类型由支持指针的语言使用,并作为在支持与不支持指针的语言间引用数据的一种通用方式。它也可用于保持句柄。例如,IntPtr 的实例广泛地用在 System.IO.FileStream 类中来保持文件句柄。 IntPtr 类型符合 CLS,而 UIntPtr 类型却不符合。只有 IntPtr 类型可用在公共语言运行库中。此类型实现 ISerializable 接口。 |
请发表评论