如何在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    责编:豆豆技术应用

正在加载评论...