SuperAPI AI 工具集

dotnet-pinvoke

通用与其它

查看项目

更新于 10-16 09:31

技能介绍

用途:从 .NET 调用原生(C/C++)库时,正确编写和审查 P/Invoke 声明,避免类型尺寸、调用约定、字符串编码、内存释放不匹配导致的间歇崩溃、数据损坏或访问冲突。

主要能力:

  • 选择 DllImport 或 LibraryImport:.NET Framework 用 DllImport;.NET 7+ 新代码优先 LibraryImport;要求 Native AOT 时只能用 LibraryImport(LibraryImport 为源生成、支持 AOT/裁剪)。
  • 类型映射要点:C long 用 CLong(Windows 32 位、64 位 Unix 为 64 位);size_t 用 nuint/UIntPtr,绝不用 ulong;Win32 BOOL 用 int;C99 bool 需 [MarshalAs(UnmanagedType.U1)];HANDLE/HWND 用 SafeHandle。
  • 字符串封送:显式指定编码,Windows API 用 W(UTF-16)变体,跨平台 C 库通常用 UTF-8,不用 CharSet.Auto,不用 StringBuilder 作输出缓冲。
  • 内存归属:明确调用方或被调用方分配与释放,释放必须使用匹配的分配器(malloc 内存不能交给 Marshal.FreeHGlobal);句柄用 SafeHandle,避免原始 IntPtr 泄漏。
  • 错误处理和回调:Win32 用 SetLastError/SetLastPInvokeError;HRESULT 用 Marshal.ThrowExceptionForHR;.NET 8+ 回调优先 UnmanagedCallersOnly,否则需为委托做 GC 根保留(GC.KeepAlive)。
  • 跨平台加载与迁移:可用 NativeLibrary.SetDllImportResolver、条件编译;将 DllImport 迁移到 LibraryImport 时替换 CharSet、SetLastError,并处理 SYSLIB1054–1057 分析器警告。

限制:目标框架、平台、内存归属契约和原生头文件为必要输入;文档与头文件冲突时以头文件为准。资料未提供具体性能、收费、价格或额外平台支持的说明。