将指针(即int [])传递给DLL时,"fixed"是否真的可以保证什么?

Dax*_*ohl 4 c# unsafe fixed dllimport

我尝试搜索这个但是没有找到任何东西,但是当将int []作为指针传递给本机DLL函数时,是不是仍然存在DLL可以维护对指针的引用的危险,然后尝试"固定"块终止后再次访问它?如果GC移动了您的阵列,这不会导致内存访问错误吗?如果是这样,你怎么解决这个问题?或者这是不太可能的情况?

Eri*_*ert 11

更新: 这个问题是我2012年12月11日博客的主题.谢谢你这个好问题!


试图寻找这个,但没有找到任何东西

当您对语言有疑问时,请考虑阅读语言规范.

当将int []作为指针传递给本机DLL函数时,DLL是否仍然存在对指针的引用的危险,然后在"固定"块终止后再次尝试访问它?

是的.正如语言规范所述:


程序员有责任确保由固定语句创建的指针不会超出这些语句的执行.例如,当固定语句创建的指针传递给外部API时,程序员有责任确保API不保留这些指针的内存.


如果GC移动了您的阵列,这不会导致内存访问错误吗?

是!

如果是这样,你怎么解决这个问题?

你没有.正如语言规范所述,您必须永远不要这样做.既然你永远不会这样做,你就不必找到办法绕过它.这就像是在问"我如何从致命的自我中恢复过来?" 你没有 - 如果你不想最终死亡,那么一个好的规则就是"不要在第一时间向自己开枪".

或者这是不太可能的情况?

您是否可能编写调用违反托管代码规则的DLL的C#程序?不知道!你告诉我 - 你觉得你可能会想做什么?

  • 两年后,我仍然无法相信我在一个C#形式上胜过@Eric Lippert.(无论多么微不足道).谢谢! (2认同)