Marshal [in]参考没有参考

时间:2017-09-05 11:30:43

标签: c# .net com marshalling com-interop

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

[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 枚举中查找了属性,但没有成功

是否有类似的东西,或者我的记忆是不正确的?在这种情况下使用这样的东西好吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找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);