这是我很久以前获得的用于与BioAPI交互的 C# 代码(我认为是从 BIOAPI 示例代码中获得的)。DoMarshall 方法返回一个 IntPtr 指向已分配的足够大的内存以容纳数组。
我没有使用托管 C++,所以我不确定需要进行哪些更改,但也许它会为您指明正确的方向。当时我正在与 UPEK 合作。我希望这有帮助...
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public class BioAPI_DATA
{
public uint Length = 0;
public byte[] Data = null;
public BioAPI_DATA() {}
public BioAPI_DATA(uint length, byte[] data) { Length = length; Data = data; }
public IntPtr DoMarshal(ref int size)
{
IntPtr ptr;
IntPtr ptrData = IntPtr.Zero;
int ofs = 0;
size = Marshal.SizeOf(Type.GetType("System.Int32")) +
Marshal.SizeOf(Type.GetType("System.IntPtr"));
ptr = Marshal.AllocCoTaskMem( size );
Marshal.WriteInt32(ptr, ofs, (int) Length);
ofs += Marshal.SizeOf(Type.GetType("System.Int32"));
if (Data != null)
{
ptrData = Marshal.AllocCoTaskMem( Data.Length );
Marshal.Copy(Data, 0, ptrData, Data.Length);
}
Marshal.WriteIntPtr(ptr, ofs, ptrData);
return ptr;
}
public void DoUnmarshal(IntPtr ptr, ref int size, bool fDeleteOld)
{
int ofs = 0;
size = Marshal.SizeOf(Type.GetType("System.Int32")) +
Marshal.SizeOf(Type.GetType("System.IntPtr"));
Length = (uint) Marshal.ReadInt32( ptr, ofs );
ofs += Marshal.SizeOf(Type.GetType("System.Int32"));
if (Length == 0)
{
if (Data != null) Data = null;
return;
}
IntPtr ptr2 = Marshal.ReadIntPtr(ptr, ofs);
if (Data == null || Data.Length != Length) Data = new byte[Length];
Marshal.Copy(ptr2, Data, 0, (int) Length);
if (fDeleteOld) { if (ptr != IntPtr.Zero) Marshal.FreeCoTaskMem( ptr ); }
}
}