我正在尝试编写一个VB.NET程序,该程序将调用非托管C DLL中的函数,并传递如下结构:
typedef struct {
unsigned char *msg;
int msglen;
}
我无法弄清楚的是如何处理“unsigned char * msg”部分。你会如何在VB.NET结构中定义它?
答案 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