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);
一些函数,尤其是在 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);