C# .NET封送处理.PtrToStringUni(IntPtr)与新字符串(char*)
除了使用C# .NET封送处理.PtrToStringUni(IntPtr)与新字符串(char*),c#,.net,string,marshalling,C#,.net,String,Marshalling,除了使用char*和使用IntPtr这一明显事实之外,和之间的区别是什么?我什么时候应该用哪个 我记得大约几年前,当我使用构造函数时,我发现了一个真正的随机访问违规行为,花费了大量的时间来追踪,而当我使用PtrToStringUni时,它就消失了。也许这不是真正的原因,我不知道,但似乎是 不过,我从来没有弄清楚区别是什么。有什么想法吗 编辑: 回答了我的大部分问题;但是:我的访问违规有什么解释吗?或者是因为其他原因吗?区别在于,如果不使用不安全的代码,就不能使用指针。char*是一个实际的指针
char*
和使用IntPtr
这一明显事实之外,和之间的区别是什么?我什么时候应该用哪个
我记得大约几年前,当我使用构造函数时,我发现了一个真正的随机访问违规行为,花费了大量的时间来追踪,而当我使用PtrToStringUni
时,它就消失了。也许这不是真正的原因,我不知道,但似乎是
不过,我从来没有弄清楚区别是什么。有什么想法吗
编辑:
回答了我的大部分问题;但是:我的访问违规有什么解释吗?或者是因为其他原因吗?区别在于,如果不使用不安全的代码,就不能使用指针。char*是一个实际的指针。IntPtr包装一个指针 从您链接的msdn: 如果指定的数组不是以null结尾的,则此构造函数的行为依赖于系统。例如,这种情况可能导致访问冲突
您的char[]null是否已终止?根据链接的答案,我可以猜测您没有将指针固定到char*,这导致(随机)GC在构造函数仍在运行时移动char*,从而导致访问冲突。猜一猜:)replicate,@adontz:噢,哇,你说得对——不过这并不能解释访问违规的原因。我会编辑。我以为你没有使用不安全的,但显然,没有它,构造函数甚至不会出现。编辑了我的答案。