Marshal [in] 没有引用的引用

Marshal [in] reference without ref

一些函数,尤其是在 COM 接口中,公开了一个 REFIID 参数,用于指定方法应该 return 的接口类型。这是一个示例方法:

[DllImport("shell32.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object SHBindToObject(IShellFolder psf, IntPtr pidl, [MarshalAs(UnmanagedType.IUnknown)]object pbc, [In]ref Guid riid);

第四个参数仅供输入,不应由 SHBindToObject 更改,因此根据 C# 惯例,将其作为参考传递是没有意义的(除了性能)。我记不太清楚了,但我记得应该有一些自定义属性或为这种情况指定的东西,告诉编组器它应该像 ref Guid 一样真正编组,而它是在签名中没有指定 ref

我在 System.Runtime.InteropServices 名称中查找属性,在​​ MarshalAsAttribute 中查找字段UnmanagedType 枚举,但没有成功。

有没有类似的,还是我记错了?在这种情况下使用这样的东西好吗?

您正在寻找 MarshalAs(UnmanagedType.LPStruct):

[DllImport("shell32.dll")]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object SHBindToObject(
    IShellFolder psf,
    IntPtr pidl, 
    [MarshalAs(UnmanagedType.IUnknown)] object pbc,  
    [MarshalAs(UnmanagedType.LPStruct)] Guid riid);