首页 > 解决方案 > 具有多个返回参数的函数

问题描述

我是 C# 新手。对于我们使用的电机驱动器,我想查看它的电流,并且电机驱动器指南中有一个 BOOL 函数。但我不知道如何使用它。

VCS_GetCurrentIsAveraged(KeyHandle,NodeId, short* pCurrentIsAveraged,
pErrorCode)

对于此函数,KeyHandle 和 NodeId 是参数,pCurrentIsAveraged 和 pErrorCode 是返回参数。

我的代码中已经有了所有参数,除了 pCurrentIsAveraged,这是我想看到的。那么我怎样才能得到这个值作为回报。

//Initialize

short* pCurrentIsAveraged;

double current;

current=VCS_GetCurrentIsAveraged(KeyHandle,NodeId,pCurrentIsAveraged,
pErrorCode)

这行得通吗,我想获取当前值,但是我应该为 pCurrentIsAveraged 值输入什么作为返回参数?

谢谢。

标签: c#function

解决方案


使用函数签名VCS_GetCurrentIsAveraged(KeyHandle,NodeId, short* pCurrentIsAveraged, pErrorCode)要求您使用不安全的代码,如果您是 C# 新手,则应避免使用。这看起来像是围绕 C 风格 API 的 ap/invoke 包装器。

就目前而言,您需要像这样调用它(从不安全的块中)(fixing如果 currentIsAveraged 恰好在堆栈上分配,则可能不需要):

short currentIsAveraged = 0;
double current;
fixed (short* pCurrentIsAveraged = &currentIsAveraged) {
   current = VCS_GetCurrentIsAveraged(KeyHandle,NodeId,pCurrentIsAveraged, pErrorCode);
}
bool isCurrentAveraged = (currentIsAveraged != 0);

如果您可以控制 p/invoke 的定义VCS_GetCurrentIsAveraged,则可以将该签名更改为使用 anref short pCurrentIsAveraged而不是short* pCurrentIsAveraged. 这将使您可以像这样使用该方法(无需不安全的代码):

short currentIsAveraged = 0;
double current;
current = VCS_GetCurrentIsAveraged(KeyHandle,NodeId,ref currentIsAveraged, pErrorCode);
bool isCurrentAveraged = (currentIsAveraged != 0);

您可以通过使用该值的属性来进一步优化 p/invoke 签名[Out],以告诉编组器跳过可能不需要的副本,并且您还可以说服编译器将其视为bool直接而不是来回使用 a short,但那是所有高级的东西。System.Runtime.InteropServices如果您对此感兴趣,请查看命名空间。


推荐阅读