怎么把PInvoke`<[In](),Out()> ByRef`转换成C#?

时间:2018-09-05 02:04:31

标签: c# vb.net pinvoke vb.net-to-c#

我有一个来自此VB.net的功能,需要将其导入C#。 我已经尝试过各种VB.NET到C#的转换器,但是它不能与与此功能相关联的导入dll正常工作。 任何人都知道如何将以下VB函数正确转换为C#:

  <DllImport("E5KDAQ.dll")> _
  Public Function E5K_ReadDIStatus(ByVal id As Short,<[In](),Out()> ByRef chnval As Integer) As Short
  End Function

使用在线转换器,它提供以下内容: 转换有错误的C#

[DllImport("E5KDAQ.dll")]
public static extern short E5K_ReadDIStatus(short id, [In()] out int chnval);

enter image description here

2 个答案:

答案 0 :(得分:2)

在这里的官方文档中:http://www.acceed.de/manuals/inlog/EDAM5000_Manual.pdf有一个C ++定义,还有一些关于第二个参数是什么的文档,这实际上是您要查看的内容:

  

VC ++ :(请参阅E5KDAQ.h)

unsigned short E5K_ReadDIStatus (int id, unsigned long *Didata);
     

参数:

     
    

id:模块ID地址

         

Didata:指向32位缓冲区以存储DI状态

  

因此C#定义应该简单地是(C ++中的longint是32位)

[DllImport("E5KDAQ")]
static extern ushort E5K_ReadDIStatus(int id, ref uint Didata)

答案 1 :(得分:0)

您可以使用它。

public static extern short E5K_ReadDIStatus(short id, ref int[] chnval)

参考:Are P/Invoke [In, Out] attributes optional for marshaling arrays?