VB.NET指针互操作问题

时间:2010-09-17 16:39:31

标签: vb.net

我正在尝试编写一个VB.NET程序,该程序将调用非托管C DLL中的函数,并传递如下结构:

typedef struct {
    unsigned char *msg; 
    int msglen;         
}

我无法弄清楚的是如何处理“unsigned char * msg”部分。你会如何在VB.NET结构中定义它?

2 个答案:

答案 0 :(得分:1)

这很大程度上取决于如何处理msg字段的内存。您需要小心释放任何已转移到托管代码的已分配内存。

话虽如此,我认为最直接的互操作类型如下

Public Structure S1 
  Public msg as IntPtr
  Public msgLen as Integer
End Structure

要将实际的msg值设为String,您需要使用以下代码。

Public Function GetString(ByVal s1 as S1) As String
  return Marshal.PtrToStringAnsi(s1.msg, s1.msgLen)
End Function

要基于S1创建String实例,请执行以下操作。注意:如果调用函数没有获得所有权,则需要释放此处分配的内存。

Public Function CreateS1(ByVal str As String) As S1
  Dim local As New S1
  local.msg = Marshal.StringToHGlobalAnsi(str)
  local.msgLen = str.Length
  return local
End Function

答案 1 :(得分:1)

<StructLayout(LayoutKind.Sequential)> _
public structure foo
  <MarshalAs(UnmanagedType.LPStr)> dim msg as string
  dim msgLen as integer
end structure