编组数据输入输出参数和参考

本文关键字:参考 参数 输入输出 数据 | 更新日期: 2023-09-27 18:26:32

在C#端,我有类似的代码

[DllImport("dppClientModule.dll", CallingConvention = CallingConvention.StdCall)]
private static extern UInt32 dppModuleDeinit(
    [In, Out, MarshalAs(UnmanagedType.LPStruct)]
    dppErrorInfo_t pErrInfo);

但它被称为

  dppErrorInfo_t ei = new dppErrorInfo_t();
  UInt32 result = dppModuleDeinit(ei);

我的第一个问题是:在上面的行中,ei不是缺少了一个ref关键字吗?

还有另一个包装器函数,如:

private void Test(ref dppErrorInfo_t x)
{
    UInt32 result = dppModuleDeinit(x);    
}

我的第二个问题是:Test调用者会观察到x变量的变化吗?(假设dppModuleDeinit确实改变了原始变量)

注意:因为通常情况下,如果dppModuleDeinit需要ref参数,则在传递给dppModuleDeinit函数时,必须将ref放在x之前,否则将不起作用

PS以下是该函数在C++上的外观

dppFUNC(HRESULT) dppModuleDeinit( 
    dppErrorInfo_t  *pErrInfo) ; // Error info

编组数据输入输出参数和参考

  1. 当您用参数定义了多个类型[In,Out,ref]时,它应该很好。

  2. 对于所有LOB,.NET在内部将这些参数作为ref传递。因此,Test的调用方必须观察这些更改。