观.NET Compact Framework中的P.Invoke
1. p/Invoke = Platform Invoke. 就是dotnet clr调用native function的一种机制
2. Data Marshaling : Marshaling字面意思是信号汇整。实际上就是clr传递数据到native时如何转换的问题。
引用类型是以指针方式传递的。不能加ref/out。
System.Boolean映射成BOOL
System.Char映射成字符类型,具体请参照MSDN
System.IntPtr映射成Handle. Int32.Zero用于比较或设置NULL
如果Native是LPTSTR时,要用StringBuilder,并分配空间再传递。因为有可以Native会写回数据。如果是LPCSTR时,则用String
如果是Native函数参数是指针参数时,用ref/out传递值类型,而引用类型直接书写不需要书写ref/out。比如Struct是值类型,用它就得用out/ref.但同样可以用class代替。这时就不用ref/out。但此时class需要用一个属性[StructLayout(LayoutKind.Sequential)],这时才能保证和Struct声明一样的内存形式。
3. 如果发生p/invoke错误,最好用Marshal.GetLast32Err()得到错误信息,然后再用异常处理抛出异常。
4. 可以到http://www.paulyao.com/resources/tools/pinvoke.asp下载工具来自动转换
2. Data Marshaling : Marshaling字面意思是信号汇整。实际上就是clr传递数据到native时如何转换的问题。
引用类型是以指针方式传递的。不能加ref/out。
System.Boolean映射成BOOL
System.Char映射成字符类型,具体请参照MSDN
System.IntPtr映射成Handle. Int32.Zero用于比较或设置NULL
如果Native是LPTSTR时,要用StringBuilder,并分配空间再传递。因为有可以Native会写回数据。如果是LPCSTR时,则用String
如果是Native函数参数是指针参数时,用ref/out传递值类型,而引用类型直接书写不需要书写ref/out。比如Struct是值类型,用它就得用out/ref.但同样可以用class代替。这时就不用ref/out。但此时class需要用一个属性[StructLayout(LayoutKind.Sequential)],这时才能保证和Struct声明一样的内存形式。
3. 如果发生p/invoke错误,最好用Marshal.GetLast32Err()得到错误信息,然后再用异常处理抛出异常。
4. 可以到http://www.paulyao.com/resources/tools/pinvoke.asp下载工具来自动转换