Skip to content

OrgEleCho/EleCho.PlatformInvoke

Repository files navigation

EleCho.PlatformInvoke

这是一个致力于将所有平台 API 编写进 .NET 的库.
它使用了 C# 语言的命名与特性, 使得平台 API 的调用变得更加简单.

目前还在 Win32 中苦苦挣扎 o(≧口≦)o

架构

1. EleCho.PlatformInvoke.Common

用来定义公共的特性与其他相关内容

2. EleCho.PlatformInvoke.Windows

包含 Windows 平台中的 WinAPI 函数定义, 常量, 结构体定义.

兼容性

本库编写于 WINVER0x0A00 的环境中, 某些结构体的字段可能在旧系统中无法工作. 例如 DEVMODEDM_SPECVERTION, 在不同系统版本中的取值也不一样

字段声明是按照 64 位操作系统来的, 不过 Windows 中 LPARAM 和 WPARAM 大小都一样, 所以不会有问题


编写规范

注: 下列所有编写规范的前提是: 不能违反 .NET 代码编写规范与命名方式

1. 函数声明

  1. [特性] 所有参数必须有正确的 In, Out, Optional 特性
  2. [特性] 自定义类型诸如 HDWP 这类本质是指针或句柄, 且需要说明的特殊类型, 必须使用 NativeType 特性来标记它在 C++ 中的类型名称
  3. [错误] 所有函数必须统一设置 SetLastErrorfalse, 用户应该用本库封装好的 GetLastError 获取错误码, 而不是调用 Marshal.GetLastPInvokeError
  4. [编码] 所有的函数都应该显示指定 EntryPoint, 指定 ExactSpellingtrue, 在使用到字符串的函数上应该指定对应字符集, 没使用到字符串的函数指定 None 字符集
  5. [指针] 所有指针参数, 如若可以, 必须使用 refout
  6. [命名] 所有函数必须使用大驼峰命名方式, 并不能包含字符集后缀.
  7. [命名:参数] 一般的, 不要对函数的参数名称进行更改, 除非使用了 refout, 则可以删去 lp 前缀

2. 常量声明

  1. 所有定义的常量都必须在库中使用枚举进行定义, 去除类型前缀, 并改为大驼峰命名. 枚举类型的大小也必须指定, 例如 uint short 之类的

3. 结构体声明

  1. [命名] 自定义类型诸如 PAINTSTRUCT, 名称与成员名称必须使用大驼峰, 并删去类型前缀(有必要的话需要添加后缀补充说明).
  2. [命名] 有必要则必须将定义的结构体名称改为全称, 例如 MSG 改为 Message, DevMode 改为 DeviceMode
  3. [命名:成员] 有必要则必须将成员简写改为全称, 例如 DlgFrame 需要改为 DialogFrame (但是 HTTP 这种大众皆知的缩写, 只需要使用 Http 即可)

4. 托管类型封送

  1. [字符串] 传入字符串的函数必须有两个重载, 一个字符串传 string, 另一个传 char*(ANSI 则是 byte*), 传出字符串也必须是两个重载, 一个传 StringBuilder, 另一个传 char*(ANSI 则是 byte*)
  2. [结构体] 结构体定义时, 它的内存布局必须与非托管结构体内存布局一致, 保证在不使用 ref 参数封送, 而是直接传结构指针时也能正确使用

例外:

如果将简称改为全称严重影响美观, 就不要改了

给编写者的提示

  1. C++ 中的 long 实际上指的是 C# 中的 int (32位有符号整数)

目前进度

已完成动态链接库: 无

正在编写的: user32.dll

更多信息, 请参阅 /work_progress 下的 xlsx 表格文件