日期:2014-05-17  浏览次数:20815 次

有关P/Invoke
非托管的c库中某一个导出函数
void BeginInvoke(unsigned char **ptr, int len);
需要C#中分配一个内存区域供访问,P/Invoke代码该怎么写?

我使用了StringBuilder来替换ptr.
但是遇到的问题是BeginInvoke()仅仅是挂接了这块内存,
之后它会持续向这个内存地址写入数据。
所以,要求C#里的StringBuilder定址——这看起来是一个不可能完成的任务。
因为C#提供的定址语句
fixed
{

}
不能跨函数使用。哪位大侠帮忙指条明路吧,谢谢

------解决方案--------------------
try
C# code

void BeginInvoke(byte[][] buffer, int len);

------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.gchandle

unsigned char **ptr相当于一个一维的字符串数组
void BeginInvoke(StringBuilder[] ptr, int len);

int len1; //len1为数组的长度
int len2; //len2为字符串的长度
StringBuilder[] ptr=new StringBuilder[len1];
for(int i=0;i<len;i++)
{
ptr[i]=new StringBuilder(len2);
}

GCHandle gch = GCHandle.Alloc(ptr);
BeginInvoke(ptr, len);
gch.Free();


------解决方案--------------------
unsigned char * 对应byte[]
void BeginInvoke(byte[][] ptr, int len);
------解决方案--------------------
现在正在研究这个,
呵呵
------解决方案--------------------
void BeginInvoke(out [MarshalAs(UnmanagedType.LPArray]]byte[] ptr, int len);
------解决方案--------------------
C# code
public static extern void BeginInvoke(IntPtr[] ptr, Int32 len);