在out参数和ref中编组数据

时间:2015-12-11 06:55:07

标签: c#

在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);

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

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

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

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

注意:由于通常dppModuleDeinit需要ref参数,因此在传递给ref时,您必须在x之前添加dppModuleDeinit那不行。

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

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

1 个答案:

答案 0 :(得分:0)

  1. 使用参数定义多种类型[In,Out,ref]应该没问题。

  2. 对于所有LOB,.NET在内部将这些参数作为ref传递。所以Test的调用者必须遵守这些变化。