传递指针(即INT [])时的DLL是否“固定”真正保证什么?
题
我试图通过一个int []当为本地DLL功能作为一个指针搜索出该但没有发现任何东西,但是,是不存在仍然该DLL可以维持到指针的引用的危险,并然后尝试“固定”块终止后再次访问它?这是不是导致内存访问错误如果GC已经动了你的阵列?如果是这样,你如何解决这个问题?或者,这是不太可能的情况?
解决方案 2
下面是我提出以解决此问题的类。它创建使用AllocHGlobal在非托管的存储空间,然后包装了一个指针,它指向的空间。不幸的是使这个通用似乎并没有工作,因为没有办法,我可以找到从void*
投在T
方法this[int i]
。
unsafe sealed class FixedFloatArray : IDisposable {
readonly float* _floats;
internal FixedFloatArray(int size) {
_floats = (float*)Marshal.AllocHGlobal(sizeof(float) * size);
}
internal FixedFloatArray(float[] floats) {
_floats = (float*)Marshal.AllocHGlobal(sizeof(float) * floats.Length);
Marshal.Copy(floats, 0, (IntPtr)_floats, floats.Length);
}
internal float this[int i] {
get { return _floats[i]; }
set { _floats[i] = value; }
}
internal void CopyFrom(float[] source, int sourceIndex, int destinationIndex, int length) {
var memoryOffset = (int)_floats + destinationIndex * sizeof(float);
Marshal.Copy(source, sourceIndex, (IntPtr)memoryOffset, length);
}
internal void CopyTo(int sourceIndex, float[] destination, int destinationIndex, int length) {
var memoryOffset = (int)_floats + sourceIndex * sizeof(float);
Marshal.Copy((IntPtr)memoryOffset, destination, destinationIndex, length);
}
public static implicit operator IntPtr(FixedFloatArray ffa) {
return (IntPtr)ffa._floats;
}
public void Dispose() {
Marshal.FreeHGlobal((IntPtr)_floats);
}
}
其他提示
<强>更新:此问题是的受试者我博客在2012年12月11日。感谢伟大的问题!
试图寻找这个,但没有发现任何东西。
考虑阅读的语言规范,当你有关于语言问题。
传递的int []当为本地DLL功能作为一个指针,是不存在仍然该DLL可以维持到指针的引用,然后尝试在“固定的”块具有后再次访问它的危险终止?
是的。作为语言规范规定:
这是程序员的职责 确保指针所创造 固定语句不超出生存 这些语句的执行。对于 例如,当指针通过创建 固定语句传递给 外部的API,它是程序员的 有责任确保这些API 不保留任何这些指针的存储器中。
这是不是导致内存访问错误如果GC已经动了你的阵列?
是!
如果是这样,你如何解决这个问题?
你不知道。由于语言规范状态,您需要永远做。因为你永远不会做到这一点,你没有找到一个办法来解决它。这有点像问“我怎么从枪杀自己恢复?”你不 - 如果你不想落得死了,然后一个很好的规则是“你自己首先不拍”
或者这是不太可能的情况?
您可能编写调用违反托管代码的规则DLL的C#程序? I 的不知道!你告诉我 - 是它的那种东西,你认为你可能会做什么?