如何在C#中使用 Win32和其他库
http://tech.ddvip.com 2006年08月01日 社区交流
本文详细介绍如何在C#中使用 Win32和其他库
这样该函数就可以正常运行了。
在互操作中使用委托时有个很重要的技巧:封送拆收器创建了指向委托的函数指针,该函数指针被传递给非托管函数。但是,封送拆收器无法确定非托管函数要使用函数指针做些什么,因此它假定函数指针只需在调用该函数时有效即可。
结果是如果您调用诸如 SetConsoleCtrlHandler() 这样的函数,其中的函数指针将被保存以便将来使用,您就需要确保在您的代码中引用委托。如果不这样做,函数可能表面上能执行,但在将来的内存回收处理中会删除委托,并且会出现错误。
其他高级函数
迄今为止我列出的示例都比较简单,但是还有很多更复杂的 Win32 函数。下面是一个示例:
DWORD SetEntriesInAcl(
ULONG cCountOfExplicitEntries, // 项数
PEXPLICIT_ACCESS pListOfExplicitEntries, // 缓冲区
PACL OldAcl, // 原始 ACL
PACL *NewAcl // 新 ACL
);
前两个参数的处理比较简单:ulong 很简单,并且可以使用 UnmanagedType.LPArray 来封送缓冲区。
但第三和第四个参数有一些问题。问题在于定义 ACL 的方式。ACL 结构仅定义了 ACL 标头,而缓冲区的其余部分由 ACE 组成。ACE 可以具有多种不同类型,并且这些不同类型的 ACE 的长度也不同。
如果您愿意为所有缓冲区分配空间,并且愿意使用不太安全的代码,则可以用 C# 进行处理。但工作量很大,并且程序非常难调试。而使用 C++ 处理此 API 就容易得多。
属性的其他选项
DLLImport 和 StructLayout 属性具有一些非常有用的选项,有助于 P/Invoke 的使用。下面列出了所有这些选项:
来源:Microsoft 责编:豆豆技术应用