编组数据输入输出参数和参考
本文关键字:参考 参数 输入输出 数据 | 更新日期: 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
-
当您用参数定义了多个类型[In,Out,ref]时,它应该很好。
-
对于所有LOB,.NET在内部将这些参数作为ref传递。因此,Test的调用方必须观察这些更改。