C# 中安全代码与不安全代码 P/Invoke
非托管代码需要在unsafe块中书写。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; namespace IntPtrSample
{
class Program
{
static void Main(string[] args)
{
string stringA = "I seem to be turned around!";
int copylen = stringA.Length; // Allocate HGlobal memory for source and destination strings
IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
IntPtr dptr = Marshal.AllocHGlobal(copylen + ); // The unsafe section where byte pointers are used.
unsafe
{
byte* src = (byte*)sptr.ToPointer();
byte* dst = (byte*)dptr.ToPointer(); src[] = (byte)'a';
src[] = (byte)'a';
src[] = (byte)'a';
src[] = (byte)'a'; if (copylen > )
{
// set the source pointer to the end of the string
// to do a reverse copy.
src += copylen - ; while (copylen-- > )
{
*dst++ = *src--;
}
*dst = ;
}
} string stringB = Marshal.PtrToStringAnsi(dptr); Console.WriteLine("Original:\n{0}\n", stringA);
Console.WriteLine("Reversed:\n{0}", stringB); // Free HGlobal memory
Marshal.FreeHGlobal(dptr);
Marshal.FreeHGlobal(sptr); }
}
}
// 参考文章
http://msdn.microsoft.com/en-us/library/system.intptr.topointer.aspx