Marsha有三个方法将string转为IntPtr:
Copies the contents of a managed String into unmanaged memory, converting into ANSI format if required.
public static IntPtr StringToHGlobalAuto(string s)
public static IntPtr StringToHGlobalAnsi(string s)
和
public static IntPtr StringToHGlobalUni(string s)
以上函数的本质其实都是:
计算出string s的长度(字节)n
然后用malloc()请求分配n个字节的内存(假设内存地址为address),接着将string s中的字符复制到malloc返回的内存中
最后将adress封装到IntPtr返回
C#中的IntPtr与C/C++中的内存指(void *)针对应,
string与const char *对应,
ref string与const char **对应
如果要用char *,使用IntPtr
如果要使用char **,使用ref IntPtr
使用例子(C++):
using namespace System;
using namespace System::Runtime::InteropServices;
int main()
{
// Create a managed string.
String^ managedString = "Hello unmanaged world (from the managed world).";
// Marshal the managed string to unmanaged memory.
char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();
// Always free the unmanaged string.
Marshal::FreeHGlobal((IntPtr)stringPointer);
return 0;
}
Marshal中有好几个个方法将IntPtr转换为字符串:
等