SuperAPI AI 工具集

cswin32-com

通用与其它

查看项目

更新于 10-15 21:12

技能介绍

用途:指导在 MSBuild 中以 CsWin32 模式实现结构体式 COM 互操作,兼容 AOT,不使用 [ComImport] 或内置封送。与 cswin32-interop 配套,后者覆盖通用 P/Invoke 与 blittable 签名规则,本指南只讲 COM 层。

主要能力:接口若在 Win32 元数据中,加入 src/Framework/NativeMethods.txt 由 CsWin32 生成;不在元数据(WMI、Fusion、Setup Configuration)则手写结构体并单独存放、用 <Compile Remove> 排除。生命周期用 using ComScope<T> 管理临时指针,禁止 T* 局部变量加 try/finally Release;BSTR 出参用 using BSTR x = default;。激活用 ComClassFactory.TryCreate 或 PInvoke.CoCreateInstance 配 IID.Get<T>()。调用经 scope.Pointer->Method(...),ComScope<T> 可隐式转换为 T**/void**。错误契约需与调用方一致,仅在异常会传播时用 ThrowOnFailure。用 #if FEATURE_WINDOWSINTEROP 守卫。

手写结构体:每个接口单独文件,实现 IComIID,函数指针用 delegate* unmanaged[Stdcall];IComIID 在 .NET 7+ 为 static-abstract,net472/netstandard2.0 为实例形式,手写需同时写出两种。vtable 槽位固定:0 QueryInterface、1 AddRef、2 Release、3+ 按 IDL 顺序。

字段与访问:非 ref 类型禁止裸 T* 字段,需用 AgileComPointer<T>(经 GIT,线程敏捷,带终结器)。BSTR 的 Dispose 调用 SysFreeString 并原地清零,using 必须作用于存储位置。

测试:结构体式 COM 走裸 vtable,托管 mock 需经 Marshal.GetComInterfaceForObject 生成 CCW 桥接;mock 必须像真实 COM 一样写所有 out 参数,异常身份会丢失,坏输入应抛 COMException 而非 Assert。

限制:资料未提供收费、平台支持范围、性能数据或安装命令等额外信息。